记忆
我今天突然想起来,以前经常使用的一个源码下载网站,背景是白色的,界面非常简单的,就是想不起来叫什么了,好几年没见过了。然后就尝试搜了搜一些关键词比如opencv 源码之类的,终于看到了pudn,就是这个,老帐号还能登录,哈哈,就是界面变了。我又找回了记忆。
PCAN linux driver
linux安装pcan驱动:
1. tar -xvf peak-linux-driver-8.8.0
2. cd peak-linux-driver-8.8.0
3. sudo make clean
4. sudo make
5. sudo make install
6. sudo modprobe pcan
7. cd driver/
8. sudo ./pcan_make_devices 2
9. ls -l /dev/pcan*
任务计数信号量 freertos
【任务计数信号量、任务二值信号量、任务事件标志组、任务消息邮箱】
任务计数信号量和计数信号量类似
优点:能提高任务切换速度,使用更少的RAM
缺点:只可以用在任务只有一个等待信号量的情况,不支持超时等待
信号量 freertos
【计数信号量】
FreeRTOS 中计数信号量的源码实现是基于消息队列实现的。
当管理多个共享资源的问题时,可以使用计数信号量。
【二值信号量】
二值信号量是计数信号量的一种特殊形式,即共享资源为 1 的情况。
【互斥信号量】
FreeRTOS 中互斥信号量的源码实现是基于消息队列实现的。
互斥信号量的主要作用是对资源实现互斥访问,使用二值信号量也可以实现互斥访问的功能,不过互斥信号量与二值信号量有区别。
互斥信号量可以防止优先级翻转,而二值信号量不支持。
消息队列 freertos
【消息队列】
消息队列就是通过 RTOS 内核提供的服务,任务或中断服务子程序可以将一个消息(注意,FreeRTOS消息队列传递的是实际数据,并不是数据地址,RTX,uCOS-II 和 uCOS-III 是传递的地址)放入到队列。
同样,一个或者多个任务可以通过 RTOS 内核服务从队列中得到消息。通常,先进入消息队列的消息先传给任务,也就是说,任务先得到的是最先进入到消息队列的消息,即先进先出的原则(FIFO),FreeRTOS的消息队列支持 FIFO 和 LIFO 两种数据存取方式。
软件定时器组 freertos
【软件定时器组】
FreeRTOS 软件定时器组的时基是基于系统时钟节拍实现的,之所以叫软件定时器是因为它的实现不需要使用任何硬件定时器,而且可以创建很多个,综合这些因素,这个功能就被称之为软件定时器组。
既然是定时器,那么它实现的功能与硬件定时器也是类似的。在硬件定时器中,我们是在定时器中断中实现需要的功能,而使用软件定时器时,我们是在创建软件定时器时指定软件定时器的回调函数,在回调函数中实现相应的功能。
软件定时器回调函数--by blink
static void vTimerCallback(xTimerHandle pxTimer)
其中的参数是传入的定时器句柄,可以从这个句柄中得到是哪个定时器ID,或者也可以直接比较之前创建的句柄来判定触发了哪个软件定时器。
事件标志组 freertos
【事件标志组】
事件标志组是实现多任务同步的有效机制之一。也许有不理解的初学者会问采用事件标志组多麻烦,搞个全局变量不是更简单?其实不然,在裸机编程时,使用全局变量的确比较方便,但是在加上 RTOS 后就是另一种情况了。使用全局变量相比事件标志组主要有如下三个问题:
a. 使用事件标志组可以让 RTOS 内核有效地管理任务,而全局变量是无法做到的,任务的超时等机制需要用户自己去实现。
b. 使用了全局变量就要防止多任务的访问冲突,而使用事件标志组则处理好了这个问题,用户无需担心。
c. 使用事件标志组可以有效地解决中断服务程序和任务之间的同步问题。
【什么时候使用事件标志组】
中断服务程序和任务之间的需要同步的时候。
任务之间需要通信或者同步的时候。
任务锁 中断锁 调度锁 freertos
【调度锁】
调度锁就是 RTOS 提供的调度器开关函数,如果某个任务调用了调度锁开关函数,处于调度锁开和调度锁关之间的代码在执行期间是不会被高优先级的任务抢占的,即任务调度被禁止。这一点要跟临界段的作用区分开,调度锁只是禁止了任务调度,并没有关闭任何中断,中断还是正常执行的。而临界段进行了开关中断操作。
【中断锁】
中断锁就是 RTOS 提供的开关中断函数,FreeRTOS 没有专门的中断锁函数,使用 FreeRTOS的中断服务程序临界段处理函数就可以实现同样效果。
【任务锁】
简单的说,为了防止当前任务的执行被其它高优先级的任务打断而提供的锁机制就是任务锁。
FreeRTOS 也没有专门的任务锁函数,但是使用 FreeRTOS 现有的功能有两种实现方法:
a. 通过给调度器加锁实现
利用 FreeRTOS 的调度锁功能给调度器加锁的话,将关闭任务切换功能,从而高优先级任务也就无法
抢占低优先级任务的执行,同时高优先级任务也是无法向低优先级任务切换的。另外特别注意,调度
锁只是禁止了调度器工作,并没有关闭任何中断。
b. 通过关闭任务切换中断 PendSV 和系统时钟节拍中断 Systick
利用 FreeRTOS 的任务代码临界段处理函数就可以关闭 PendSV 中断和 Systick 中断。因为进入临界
段前,操作寄存器 basepri 关闭了所有小于等于宏定义configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 所定义的中断优先级(实现任务切换功能的 PendSV 中断和滴答定时器中断是最低优先级中断,所以也是被关闭的),这样低优先级任务在执行临界段代码期间是不会被高优先级任务打断的,从而就实现了任务锁的效果。
临界区处理 freertos
FreeRTOS 源码中就有多处临界段的处理,跟 FreeRTOS 一样,uCOS-II 和 uCOS-III 源码中都是有临界段的,而 RTX 的源码中不存在临界段。另外,除了 FreeRTOS 操作系统源码所带的临界段以外,用户写应用的时候也有临界段的问题,比如以下两种:
* 读取或者修改变量(特别是用于任务间通信的全局变量)的代码,一般来说这是最常见的临界代码。
* 调用公共函数的代码,特别是不可重入的函数,如果多个任务都访问这个函数,结果是可想而知的。
总之,对于临界段要做到执行时间越短越好,否则会影响系统的实时性。