(六)FreeRTOS软件定时器、事件组、内存管理

软件定时器

      为了周期性处理某些事务,每个MCU都自带几个硬件定时器,FreeRTOS也是实现了定时器,不过是软件层面上的,所以精度自然没有硬件定时器高,但是处理某些精度要求不高的事务还是够的。

      像MCU上的硬件定时器一样,我们希望定时器经过一个周期之后就能反馈一定的动作。所以软件定时器中也需要中我们也要自己实现回调函数,但是在定时回调函数中不能调用任何回阻塞任务的API函数(vTaskDelay、vTaskDelayUnti),因为一旦阻塞会导致定时器的运行。

      定时器并不属于FreeRTOS内核的功能,它是一个应用层上面实现的一个功能,通过应用层调用相关的API,然后发送到到定时器队列中,定时器服务函数就会执行相应的动作

   定时器使用相关API

总结: FreeRTOS提供软件定时器帮助用户快速实现定时功能,完成周期性任务。

事件标志组

      信号量用于任务、中断之间的同步,只能实现一对一,但有些情境中要求一个任务可以同时与多个任务保持通信,进行同步,因此FreeRTOS中提供了事件标志组来解决这个问题。

      每一个事件的触发情况存储在一个变量中的每一个bit,通过判断bit上的值为1或0来判断某个事件是否触发。FreeRTOS中提供两种存储类型,一种是8位,一种是24个位,但是实际的变量类型是16位与32位,其中高8位用来处理其它的事情。

#if( configUSE_16_BIT_TICKS == 1 )
 typedef uint16_t TickType_t;
 #define portMAX_DELAY ( TickType_t ) 0xffff
#else
 typedef uint32_t TickType_t;
 #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
 #define portTICK_TYPE_IS_ATOMIC 1
#endif

       通过定义可以看出当configUSE_16_BIT_TICKS定义为1时,TickType_t是一个16位的数据类型,当configUSE_16_BIT_TICKS定义为0时,TickType_t是一个32为的数据类型。

总结:当项目需要用到多任务通信,事件标志组绝对是最佳的选择。

内存管理

FreeRTOS中提供了五种内存管理方法,分别在heap_1、heap_2、heap_3、heap_4、heap_5.五种管理方法,各有利弊。

总结:

      第一种方法使用最方便,第二种方法在第二种方法上进行了优化,增加内存释放函数,第三种方法对标准C语言函数进行封装,增加线程保护,第四种方法对前面几种算法进行优化,增加了内存碎片管理方法,第五种方法增加了跨越内存段功能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值