文章分类 -  freeRTOS代码分析

摘要:一、列表与列表项 二、队列 三、列表、与TCB里的列表项 1. 任务就绪列表:调度器切换任务时的目的列表。每个优先级一个任务就绪列表。2. 任务挂起就绪列表:调度器挂起时,如有任务准备就绪,只能先进任务挂起就绪列表。当调度器恢复时,任务从挂起就绪列表,移动到任务就绪列表。3. 任务挂起列表:被sus 阅读全文
posted @ 2017-12-22 02:36 为民除害 阅读(843) 评论(0) 推荐(1)
摘要:标准 C 库中的 malloc()和 free()也可以实现动态内存管理,但是如下原因限制了其使用: ● 在小型的嵌入式系统中效率不高。● 会占用很多的代码空间。● 它们不是线程安全的。● 具有不确定性,每次执行所用的时间不同。● 会导致内存碎片。● 使链接器的配置变得复杂。 五种内存分配方案: F 阅读全文
posted @ 2017-11-29 02:18 为民除害 阅读(2523) 评论(0) 推荐(0)
摘要:一、任务通知(Task Notifictions) 可以代替信号量、消息队列、事件标志组等这些东西。使用任务通知的话效率会更高! #if( configUSE_TASK_NOTIFICATIONS == 1 ) volatile uint32_t ulNotifiedValue; volatile 阅读全文
posted @ 2017-11-29 02:09 为民除害 阅读(2130) 评论(0) 推荐(0)
摘要:一、概念:软件定时器、定时器服务任务、定时器命令队列 软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的回调函数。 不能在回调函数中调用任何会阻塞任务的 API 函数 ! 定时器是一个可选的、不属于 FreeRTOS 内核的功能,它是由定时器服务(或 Daemon)任务来提供的。 Free 阅读全文
posted @ 2017-11-26 22:10 为民除害 阅读(2070) 评论(0) 推荐(0)
摘要:低功耗模式 1. 芯片原本就支持的硬件低功耗 2. freeRTOS提供的软件低功耗,Tickless模式! 当用户将宏定义 configUSE_TICKLESS_IDLE 配置为 1 且系统运行满足以下两个条件时, 系统内核会自动的调用,低功耗宏定义函数 portSUPPRESS_TICKS_AN 阅读全文
posted @ 2017-11-24 16:53 为民除害 阅读(7354) 评论(0) 推荐(1)
摘要:任务需要与多个事件或任务进行同步时,需要用到事件标志组。 一个事件组就是一组的事件位, 事件组中的事件位通过位编号来访问。 事件标志组的数据类型为 EventGroupHandle_t。 事件标志组中的所有事件位都存储在一个无符号的 EventBits_t 类型的变量中。 EventBits_t 类 阅读全文
posted @ 2017-11-24 14:27 为民除害 阅读(1418) 评论(0) 推荐(0)
摘要:用于信号量的队列,都是只有队列数据结构的空间,没有队列项存储空间的队列。 二值、计数、互斥、递归互斥,创建完成之后的内存状态:(转自 http://blog.csdn.net/zhzht19861011/article/details/51537234) 一、创建二值信号量 只关注这个队列是否为满, 阅读全文
posted @ 2017-11-20 21:04 为民除害 阅读(2874) 评论(0) 推荐(0)
摘要:相对时间延时 >1 记录时间点O >2 将任务从就绪列表删除 >3 根据时间点O,计算唤醒的时间点 >3' 将唤醒时间点,写入任务状态列表项的value里,用于排序插入。 >4 根据唤醒时间点,将任务加入到延时列表或者溢出的延时列表 >5 更新NextTaskUnblockTime 为什么有两个延时 阅读全文
posted @ 2017-11-20 11:39 为民除害 阅读(1541) 评论(0) 推荐(0)
摘要:开启调度器 一、开启systick 二、开启FPU,浮点处理单元 CPACR Register to enable floating point unit feature; available on Cortex -M4 with floating point unit only 三、开启第一个任务 阅读全文
posted @ 2017-11-19 23:19 为民除害 阅读(5445) 评论(0) 推荐(0)
摘要:使用PendSV实现任务切换 在调度器不挂起的情况下,在任务函数中,一旦置位PendSV请求,立即产生任务切换。 一旦置位,立即切换! 一旦置位,立即切换! 一旦置位,立即切换! 一、系统调用 taskYIELD: 二、系统滴答定时器中断: 系统调用TaskYield和滴答定时器中断,都在做同一个事 阅读全文
posted @ 2017-11-19 20:34 为民除害 阅读(1978) 评论(0) 推荐(1)
摘要:任务挂起: 它把所有挂起的任务加到 xSuspendedTaskList 中, 而且一旦调用 vTaskSuspend() 函数挂起一个任务,该任务就将从所有它原先连入的链表中删除(包括就绪表,延时表和它等待的事件链表【两类列表都要清掉】), 也就是说,一旦一个任务被挂起,它将取消先前它的延时和对事 阅读全文
posted @ 2017-11-17 20:25 为民除害 阅读(5935) 评论(0) 推荐(0)
摘要:直接上代码 ##1 (1)configUSE_PORT_OPTIMISED_TASK_SELECTION被定义为1的时候: 如果这个优先级的 任务就绪列表的长度为0,则调用下面的 portRESET_READY_PRIOR uxTopReadyPrior的定义: uxTopReadyPrior变量的 阅读全文
posted @ 2017-11-16 21:03 为民除害 阅读(3605) 评论(0) 推荐(0)
摘要:xTaskCreate 阅读全文
posted @ 2017-11-16 19:21 为民除害 阅读(2165) 评论(0) 推荐(0)
摘要:出队操作类似于入队的操作。先整明白入队的操作,这个就好说了。 函数在读取消息的时候是采用拷贝方式的,所以用户需要提供一个数组或缓冲区来保存读取到的数据, 所读取的数据长度是创建队列的时候所设定的每个队列项目的长度 BaseType_t xQueueReceive( QueueHandle_t xQu 阅读全文
posted @ 2017-11-16 11:20 为民除害 阅读(2899) 评论(0) 推荐(0)
摘要:解锁过程: 先处理 TxLock, while(根据TxLock的值,看看队列上锁期间是否有“入队操作”,如果有) { 则观察事件等待列表,有任务在等待则, 将这个任务从事件等待列表WaitToRcv中踢掉,加入就绪列表 或 Pending就绪列表(函数TaskRemoveFromEventList 阅读全文
posted @ 2017-11-15 18:07 为民除害 阅读(2411) 评论(0) 推荐(0)
摘要:向队列发送消息 BaseType_t xQueueSend ( QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait 入队阻塞时间);BaseType_t xQueueSendToBack (QueueHa 阅读全文
posted @ 2017-11-15 15:25 为民除害 阅读(4000) 评论(0) 推荐(1)
摘要:freeRTOS最吸引我的地方,就是他的任务间通信、任务间同步所用的概念,全部都建立在“队列”的基础之上。 只要抓住队列的实现,对其他的就比较清晰了。 对任务状态的管理,建立在“列表”的基础之上。 本节只有创建队列、初始化队列两部分。参考地址:http://blog.csdn.net/zhzht19 阅读全文
posted @ 2017-11-15 10:37 为民除害 阅读(2392) 评论(0) 推荐(0)
摘要:列表表头List_t,列表项ListItem_t,以及列表项的增删 阅读全文
posted @ 2017-11-14 17:19 为民除害 阅读(2067) 评论(0) 推荐(0)