自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 资源 (1)
  • 收藏
  • 关注

转载 RT-Thread 05内存管理

在计算系统中,变量、中间数据一般存放在系统存储空间中,只有在实际使用时才将它们从存储空间调入到中央处理器内部进行运算。通常存储空间可以分为两种:内部存储空间和外部存储空间。内部存储空间访问速度比较快,能够按照变量地址随机地访问,也就是我们通常所说的RAM(随机存储器),或电脑的内存;而外部存储空间内所保存的内容相对来说比较固定,即使掉电后数据也不会丢失,这就是通常所讲的ROM(只读存储器),也可以把

2017-10-05 22:10:44 3667 1

转载 RT-Thread 04任务间同步及通讯 -互斥量、事件、邮箱、消息队列

互斥量互斥量又叫相互排斥的信号量,是一种特殊的二值性信号量。它和信号量不同的是,它支持互斥量所有权、递归访问以及防止优先级翻转的特性。互斥量工作如 互斥量的工作示意图 所示。互斥量的状态只有两种,开锁或闭锁(两种状态值)。当有线程持有它时,互斥量处于闭锁状态,由这个线程获得它的所有权。相反,当这个线程释放它时,将对互斥量进行开锁,失去它的所有权。当一个线程持有互斥量时,其他线程将不能够对它进行开锁

2017-09-25 13:52:38 4108 1

转载 RT-Thread 03任务间同步及通讯 -中断关闭、调度器锁、信号量

在多任务实时系统中,一项工作的完成往往可以通过多个任务协调的方式共同来完成,例如一个任务从传感器中接收数据并且将数据写到共享内存中,同时另一个任务周期性的从共享内存中读取数据并发送去显示(如图 两个线程间的数据传递 )如果对共享内存的访问不是排他性的,那么各个线程间可能同时访问它。这将引起数据一致性的问题,例如,在显示线程试图显示数据之前,传感器线程还未完成数据的写入,那么显示将包含不同时间采样

2017-09-18 23:11:29 4326

原创 STM32使用Jlink烧写与boot合并烧写的方法

1 概述本文主要描述STM32的bootloader及应用程序HEX文件的合并,以及相应的烧写方法。2 适用范围1. 相关的开发人员2. 需要烧写的其他人员3 创建烧写使用的HEX文件3.1 Hex文件的获取通过对ECU-R以及Bootloader程序的编译获得我们所需要的两个hex文件。ECU-R对应的HEX文件名为STM32_RTT_F107RC.hex,Bootloader对应的He

2017-09-14 22:47:12 9875

原创 keil RT-Thread相关调试基本使用技巧

1 概述本文档主要用于介绍STM32裸机的调方法以及RT-thread系统下的调试方法。两个例子都将以LED为例,裸机将以跑马灯为例,RT-thread将以心跳等为例进行讲解。2 STM32裸机调试方法打开“标准例程-V3.5库函数版本”目录下的“实验1跑马灯-库函数操作”项目作为本次实验的目标项目。下面将介绍两种方式进行调试:1、软件仿真、2、下载调试。 相关调试按键介绍: 图1:调试栏

2017-09-14 22:38:47 5278

转载 RT-Thread 02定时器

定时器管理定时器,是指从指定的时刻开始,经过一个指定时间,然后触发一个事件,类似定个时间提醒第二天能够按时起床。定时器有硬件定时器和软件定时器之分:1. ***硬件定时器***是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是***中断触发***方

2017-09-14 21:31:30 2010

转载 RT-Thread 01线程调度与管理

2.1 实时系统的需求 实时系统是一种需求倾向性的系统,对于实时的事件需要在第一时间内做出回应,而对非实时任务则可以在实时事件到达时为之让路——被抢占。所以实时系统也可以看成是一个等级系统,不同重要性的任务具有不同的优先等级:重要的事件能够优先被响应执行,非重要的事件可以适当往后推迟。 在RT-Thread实时操作系统中,任务采用了线程来实现,线程是RT-Thread中最基本的调度单

2017-09-12 23:24:33 3315 1

转载 Keil uVision5 下载程序 add flash programming algorithm选项缺少需要的算法解决办法

本文转载自 http://blog.csdn.net/u010893262/article/details/70847475MDK开发环境从V4升级到V5后,支持包不再是集成到开发环境当中,而是封装在PACK中,需要自行安装,比较麻烦。搭建MDK开发环境以及破解的方法,在前面的文章中有详细说明,这里不再赘述,有兴趣的可以参考:http://www.cnblogs.com

2017-05-31 20:45:40 1794

原创 SPI总线协议

SPI总线协议及SPI时序图详解    SPI,是英语 Serial Peripheral Interface 的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。    SPI 是一个环形

2017-05-24 16:33:00 479

原创 解放串口调试(使用JLink SEGGER RTT来打印和输入调试信息)

解放串口调试(使用JLink SEGGER RTT来打印和输入调试信息)之前调试一直使用的串口作为调试口,但是由于串口数量的限制所以必须找到另一种方法作为调试使用。于是在网上寻找到了这个方法,在此记录方便以后的查询。1、使用JLINK SEGGER RTT打印调试信息很简单,首先从Jlink官网上下载RTT代码,然后将这四个文件添加到自己工程中去,并且在主程序工程中添加SEGGER_R

2017-05-20 16:47:35 8494 2

转载 RT-Thread的CPU使用率计算

CPU 的使用率一般是我们比较关心的问题,在这里我们就用空闲线程的钩子函数去统计 CPU 的使用率,并通过串口打印出来。首先我们在初始化线程中设置好钩子函数,并在 LED 线程中给系统人为的加入很多“事情”,让其占用率变高,方便统计,然后每个 1 秒中打印一次 CPU 使用率。其中 CPU 的使用率我们是根据 CPU 的空闲率反推出来的。//CPU使用率#include

2017-05-19 15:13:45 1217

原创 深入了解DHCP的4步租约过程

最近在调试STM32F107+LAN8720+lwip的过程中网络方面遇到了很多问题。同时因为自己刚刚接触STM32单片机方面的知识,还有很多方面需要学习的。闲话不多说,先让我们简单了解下DHCP相关的知识。DHCP的4步租约过程DHCP租约过程就是DHCP客户机动态获取IP地址的过程。DHCP租约过程分为4步:1、客户机请求IP(客户机发DHCPDISCOVER广播包);

2017-05-17 22:02:52 10568

原创 Linux系统编程巩固--04

一.sprintf:往字符串中输入数据fprintf:往文件中输入数据读写文件用那一套函数?标C还是UC函数如果考虑通用性,就使用标C函数,如果确定只在Unix/Linux下使用,UC的也行time a.out可以查看a.out的运行时间文件读写的位置用偏移量记录,在文件表中存储了偏移量。函数lseek()可以随意移动偏移量off_t

2016-10-18 09:51:18 289

原创 Linux系统编程巩固--03

系统调用--因为用户空间不能直接访问内核空间,想完成功能又必须得到内核的支持.因此,内核层提供了系统调用,做用户空间进入内核空间的桥梁。系统调用是一系列的函数,包括各种系统的功能。我们系统编程接触的大多数都是系统调用一.文件操作非常常用的函数,包括读写函数和非读写函数在linux中,几乎一切都是文件,目录,内存,各种硬件设备都可以看成文件比如/dev/tty代表键盘和显

2016-10-18 09:37:18 250

原创 Linux系统编程巩固--02

一.静态库1.为什么需要库二进制形式目标模块的包a.o  |b.o  |----abc.a----库c.o  |2.库的类型1)静态库:扩展名.a,库中所封装的二进制代码,在链接阶段被复制到调用模块中2)动态库:扩展名.so,库中所封装的二进制代码,在链接阶段并不复制到调用模块中,被嵌入到调用模块中的仅仅是被调用函数在共享库的地址,根据这个地址动态执行共享库

2016-10-17 10:31:49 241

原创 Linux系统编程巩固--01

学习Linux系统编程主要包括学习一下内容:开发环境、内存管理、文件系统、进程管理、信号处理、进程通信、线程管理、线程同步和网络编程。一.Unix操作系统1.美国AT&T,贝尔实验室1971年多用户,多任务,多处理器商用2.三个派系1.system VIBM AIX ....2.berkleyfreeBSDmetBSDopenBSD.

2016-10-17 10:16:31 426

原创 深入理解Linux内核day10--信号

信号    信号在最早的Unix系统中即被引用,用于在用户态进程间通信。内核也用信号通知进程系统所发生的事件。信号已有30多年的历史,但只有很小的变化。    信号的作用    信号(signal)是很短的消息,可以被发送到一个进程或一组进程。发送给进程的唯一信息通常是一个数,以此来标识信号。在标准信号中,对参数、信息或者其他相随的信息没有给与关注。    名字前缀为SIG的一

2016-05-05 18:04:12 1413

原创 深入理解Linux内核day09--系统调用

系统调用    操作系统为在用户态运行的进程与硬件设备(如CPU、磁盘、打印机等等)进行交互提供了一组接口。    Unix系统通过向内核发出系统调用(system call)实现用户态进程和硬件设备之间的大部分接口。    POSIX API和系统调用    让我们先强调下应用编程接口(API)与系统调用之间的不同。前者只是一个函数定义,说明了如何获得一个给定的服务;而后者是

2016-05-05 14:13:10 1695

原创 深入理解Linux内核day08--进程线性地址空间

进程地址空间    内核中的函数以相当直截了当的方式获得动态内存:        1.__get_free_pages()和alloc_pages()从分区页框分配器中获得页框。        2.kmem_cache_alloc()和kmalloc()使用slab分配器为专门或通用对象分配快。        3.vmalloc()和vmalloc_32()获得一块非连续的内存区。

2016-05-05 10:45:31 2942

原创 深入理解Linux内核day07--内存管理

内存管理    RAM的某些部分永久的分配给内核,并用来存放内核代码以及静态内核数据结构。    RAM的其余部分称为动态内存(dynamic memory),这不仅是进程所需的宝贵资源,也是内核本身所需的宝贵资源。实际上,整个系统的性能取决于如何有效地管理动态内存。    因此,现在所有多任务操作系统都在尽力优化对动态内存的使用,也就是说,尽可能做到当需要时分配,不需要时释放。 

2016-05-04 14:22:46 1103

原创 深入理解Linux内核day06--进程调度

进程调度    Linux和任何分时系统一样,通过一个进程到另一个进程的快速切换,达到表面上看来多进程同时执行的神奇效果。    调度策略    传统Unix操作系统的调度算法必须实现几个互相冲突的目标:进程响应时间尽可能快,后台作业的吞吐量尽可能高,尽可能避免进程的饥饿线性,低优先级和高优先级进程的需要尽可能调和等等。    决定什么时候以怎样的方式选择一个新进程运行的这组规

2016-05-03 14:30:27 2463

原创 深入理解Linux内核day05--定时测量

定时测量    很多计算机化的活动都是由定时测量(timing measurement)来驱动的,这常常对用户是不可见的。例如,当你停止使用计算机的控制台以后,屏幕会自动关闭,这的归因于定时器,它允许内核跟踪你按键或移动鼠标后到现在过了多少时间。    Linux内核必需完成两种主要的定时测量,我们可以对此加以区别:        保存当前时间和日期,以便能通过time(),ftime

2016-04-29 15:56:56 4119

原创 深入理解Linux内核day04--内核同步

内核同步    你可以把内核看作是不断对请求响应的服务器,这些请求可能来自在CPU上执行的进程,也可能来自发出中断请求的外部设备。    内核如何为不同的请求提供服务    为了更好的理解内核代码是如何执行的,我们把内核看作必须满足两种请求的侍者:一种请求来自于顾客,另一种请求来自数量有限的几个不同的老板。    对不同的请求,侍者采用如下的策略:        1、老板提

2016-04-29 12:13:13 4979

原创 深入理解Linux内核day03--中断和异常

中断和异常    中断(interrupt)通常被定义为一个事件,该事件改编处理器执行的指令顺序。这样的事件与CPU芯片内部外部硬件电路产生电信号相对应。    中断通常分为同步中断(synchronous)中断和异步(asynchronous)中断:        同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断。  

2016-04-28 16:09:30 4603

原创 深入理解Linux内核day02--进程

看的第二天,还是要好好学习下操作系统相关的,为后面写驱动做准备。进程    进程是任何多道程序设计的操作系统中的基本概念。通常把进程定义为程序执行的一个实例。    该节将首先介绍进程的静态特性,然后描述内核如何进行进程切换。    进程、轻量级进程和线程    进程是程序执行时的一个实例。你可以把它看作充分描述程序以及执行到何种程度的数据结构的汇集。    从内核

2016-04-27 17:39:45 1470

原创 深入理解Linux内核day01--内存寻址

内存寻址内存地址:    逻辑地址: 段+偏移量 组成    线性地址: 可用来表达4GB的地址 (也称虚拟地址)    物理地址: 用于内存芯片级内存单元寻址。他们与微处理器地址引脚发送到内存总线上的电信号相对应    内存控制单元(MMU) 通过一种称为分段单元的硬件店里把一个逻辑地址转换为线性地址,接着通过分页单元的硬件电路把线性地址转换成一个物理地址。

2016-04-26 18:43:17 2907

原创 HP pavilion 安装ubuntu14.04后无线无法使用问题总结

不能使用主要是现在并没有对应的驱动,在这里我们称了固件,可以在以下网站下载到对应的固件:https://wireless.wiki.kernel.org/en/users/Drivers/iwlwifi对于固件有版本的要求,我现在用的intel3165的无线网卡要求我们的内核必须在4.1以上。所以接下来我们就需要把内核的版本升级到4.1以上具体方法如下:1. 下

2016-01-15 16:20:07 1389

原创 如何将CSV导入到Mysql中以及从mysql中导出

由于工作需要,经常需要将mysql数据库中的数据导出到excel表格,或者需要将excel表格数据导入到mysql数据库,我的方法是先将它们都转换成一种中间数据格式csv(execl数据可以直接导出为csv格式,csv格式也可以直接用excel打开)。下面介绍一下操作步骤:需要提前建立好对应的表格。csv导入mysqlload data infile 'C:

2016-01-15 16:18:12 513

原创 如何将CSV导入到Mysql中以及从mysql中导出

由于工作需要,经常需要将mysql数据库中的数据导出到excel表格,或者需要将excel表格数据导入到mysql数据库,我的方法是先将它们都转换成一种中间数据格式csv(execl数据可以直接导出为csv格式,csv格式也可以直接用excel打开)。下面介绍一下操作步骤:表格需要提前建立好(对应)csv导入mysqlload data infile 'C:

2016-01-15 16:17:27 417

原创 HP pavilion安装Ubuntu14.04后,无线不能使用解决方案

先在这个网页中寻找到对应的drivershttps://wireless.wiki.kernel.org/en/users/Drivers/iwlwifi我的是Intel® Wireless 3165 (4.1) 现在的ubuntu14.04的内核是3.13显然和要求的4.1不符。所以现在必须先将内核升级到4.1以上版本升级的具体步骤如下:1. 下载源码  ww

2016-01-15 16:07:28 925

转载 理解OAuth 2.0

OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749。一、应用场景为了理解OAuth的适用场合,让我举一个假设的例子。有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用

2015-11-16 21:36:33 395

原创 四、文件名置换

当你在使用命令行时,有很多时间都用来查找你所需要的文件。S h e l l提供了一套完整的字符串模式匹配规则,或者称之为元字符,这样你就可以按照所要求的模式来匹配文件。还可以使用字符类型来匹配文件名。在命令行方式下,使用元字符更为快捷,所以在本章我们只介绍这部分内容。在本章我们将讨论:•匹配文件名中的任何字符串。•匹配文件名中的单个字符。•匹配文件名中的字母或数字字符。下面就是

2015-06-06 17:13:08 359

原创 三、后台执行命令

当你在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要的事情要做,比如阅读电子邮件。对于密集访问磁盘的进程,你可能希望它能够在每天的非负荷高峰时间段运行。为了使这些进程能够在后台运行,也就是说不在终端屏幕上运行,有几种选择方法可供使用。本章重点讨论如下内容:A、设置crontab文件,并且用它来提交作业B、使用at命令来提交作业C、在后台提交作业D

2015-06-06 00:53:31 562

原创 二、使用find和xargs

有时可能需要在系统中查找具有某一特征的文件(例如文件权限、文件属主、文件长度、文件类型等等)。这样做可能有很多原因。可能出于安全性的考虑,或是一般性的系统管理任务,或许只是为了找出一个不知保存在什么地方的文件。Find是一个非常有效的工具,它可以遍历当前目录甚至于整个文件系统来查找某些文件或目录。本章的主要内容如下:1、find命令选项2、使用find命令不同选择的例子3、使用fi

2015-06-05 15:30:48 522

原创 一、文件安全与权限

本节主要内容:1、  文件和目录的权限。2、  setuid。3、  chown和chgrp4、  umask5、  符号链接 (一)文件在linux中无论什么都可以作为一个文件。当你创建一个文件的时候,系统将保存有关该文件的全部信息,其中包括:1、  文件的位置。2、  文件的类型3、  文件长度4、  哪位用户拥有该文件,哪些用户可以访问该文件

2015-06-04 23:37:40 565

C语言学生管理系统

1 /* 2 主函数 3 时间:2015/04/11 4 */ 5 #include "menu.h" 6 #include "student.h" 7 #include "teacher.h" 8 #include "manager.h" 9 static int init(void); // 初始化函数 10 static void destroy_all(void); //销毁全部链表 11 int main(void) 12 { 13 int ret; 14 printf("\033[?25l"); 15 ret = init(); 16 if(ret != 0) 17 { 18 printf("init_error %d\n",ret); 19 return -1; 20 } 21 22 menu_operation(); 23 //结束操作,销毁全部链表 24 destroy_all(); 25 } 26 27 28 //初始化函数 29 static int init(void) 30 { 31 //1管理员信息初始化 32 if(init_manager() != 0) 33 { 34 return -1; 35 } 36 //2教师信息初始化 37 if(init_student() != 0) 38 { 39 return -2; 40 } 41 //3学生信息初始化 42 if(init_teacher() != 0) 43 { 44 return -3; 45 } 46 return 0; 47 48 } 49 static void destroy_all(void) 50 { 51 //管理员链表销毁 52 destroy_manager(); 53 //教师链表销毁 54 destroy_teacher(); 55 //学生链表销毁 56 destroy_student(); 57 CLEAR_SCREEN(); 58 printf("\033[34m\033[2;60H%s\033[0m","感谢您的使用谢谢!\n"); 59 getchar(); 60 getchar(); 61 printf("\033[?25h"); 62 }

2015-06-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除