FreeRTOS
文章平均质量分 53
老子姓李!
单片机开发、嵌入式开发、MATLAB、Linux、电子设计等,忙于学习,感谢关注。私信评论看到了就必回。
展开
-
【FreeRTOS】13.STM32移植-互斥信号量
互斥信号量实质是一个拥有优先级继承的二值信号量,当互斥信号量在被一个低优先级的任务使用,高优先级的任务尝试获取这个互斥信号量而被阻塞。由于继承特性,此时低优先级的任务会被提升到与高优先级任务相同的优先级。互斥信号量将“优先级翻转”的影响降到最低,但是并不能完全消除。所以,硬实时应用应该在设计时,尽量避免优先级翻转。此外,互斥信号量不能用于中断。原因有两点:1.优先级继承机制只适用于任务,并不能用于中断服务函数。2.中断讲究快进快出,不能因为阻塞时间进入阻塞状态。API函数函数描述原创 2021-08-24 13:45:51 · 249 阅读 · 0 评论 -
【FreeRTOS】14.STM32移植-软件定时器
软件定时器硬件定时器功能强大,遗憾数量较少。故可以使用软件定时器来拓展,软件定时器允许设置一段时间,当设置的时间达到后就执行指定的功能函数,模拟实现定时器中断的功能。回调函数被定时器调用的函数叫定时器回调函数,回调函数执行的间隔叫定时器周期。软件定时器的回调函数在定时器服务任务中执行的,一定不用在回调函数中调用任何会阻塞的任务API函数,如vTaskDelay、vTaskDelayUnti、阻塞信号量等。定时器服务任务与队列定时器是可选的、不属于FreeRTOS内核的功能,由定时器服务任务提供。原创 2021-08-24 13:45:13 · 318 阅读 · 1 评论 -
【FreeRTOS】9.STM32移植-队列
定义:队列是任务与任务、中断与任务直接通信二准备的。队列用于消息传递,又叫做消息队列。需要交流的数据保存在队列中,叫做队列项目。队列所能保存的队列项数量叫队列长度。typedef struct QueueDefinition{ int8_t *pcHead; //头 int8_t *pcTail; //尾 int8_t *pcWriteTo; //下一个空闲区域 union //联合体 { int8_t *pcReadFrom; //当用作队列指向原创 2021-08-23 11:35:23 · 328 阅读 · 0 评论 -
【FreeRTOS】4.STM32移植-列表和列表项
为什么学列表和列表项?列表和列表项是一种数据结构,作为FreeRTOS的一个基石,源码中使用了大量的列表和列表项。列表:typedef struct xLIST{ listFIRST_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ configLIST_VOLATILE UBaseType_t uxNumbe原创 2021-08-23 11:27:11 · 161 阅读 · 0 评论 -
【FreeRTOS】12.STM32移植-优先级翻转
优先级翻转高优先级的任务由于等待信号量而被挂起,导致不需要信号量的低优先级任务先运行。实验目的在使用二值信号量的时候会存在优先级翻转的问题,本实验通过模拟的方式实现优先级翻转,观察优先级翻转对抢占式内核的影响。实验设计设置了四个任务。start_task:创建3个任务high_task:高优先级任务,获取二值信号量触发middle_task:中优先级任务,简单引用任务low_task:低优先级任务,和高优先级任务一样需获取同一个二值信号量才能触发,占用信号量的时间比较长实验代码:#in原创 2021-08-24 13:44:27 · 199 阅读 · 0 评论 -
【FreeRTOS】11.STM32移植-计数型信号量
计数型信号量又叫数值信号量。用户只需要关心信号量存了多少数据量。应用:事件计数每次事件发生的时候,在事件处理函数中释放信号量,信号量计数值加一。其他任务获取信号量处理事件,信号量计数减一。信号量的值就是队列结构体成员uxMessgesWaiting。初始值需赋值为0资源管理信号量的初始值为资源数量,获取成功后减1,释放加1。相关API函数函数描述xSemaphoreCreateCounting()动态方法创建计数型信号量xSemaphoreCreate原创 2021-08-23 11:37:20 · 149 阅读 · 0 评论 -
【FreeRTOS】10.STM32移植-二值信号量
信号量类似于标记位, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。信号量主要目的有两个:共享资源访问、任务同步。信号量分类:1.二值信号量2.技术型信号量3.互斥信号量4.递归互斥信号量二值信号量创建函数描述vSemaphoreCreateBinary()动态创建二值信号量,老版本(默认调用Give)xSemaphoreCreateBinary()动态创建二值信号量,新版(默认无效,需要用户Give,返回值为创建成功句柄)原创 2021-08-23 11:36:29 · 231 阅读 · 0 评论 -
【FreeRTOS】 8.STM32移植-延时函数
FreeRTOS 延时函数vTaskDelay()函数 vTaskDelay()是相对模式(相对延时函数),函数 vTaskDelayUntil()是绝对模式(绝对延时函数,,while循环的时间是绝对的)。要使用的话宏 INCLUDE_vTaskDelay 必须为 1。绝对延时保证周期性。绝对延时使用方法:TickType_t PreviousWakwTime;// 延时50ms,但是vTaskDelayUntil的参数为需要设置的节拍数,不能直接设置延时时间,使用pdMS_TO_TICKS(原创 2021-08-23 11:33:46 · 822 阅读 · 0 评论 -
【FreeRTOS】7.STM32移植-内核控制函数与临界区
内核控制函数函数 taskYIELD()此函数用于进行任务切换, 此函数本质上是一个宏。临界区代码保护,在临界区的任务拒绝任务调度的打断。如读取IIC数据,不能被打断,需进入临界区。函数描述taskYIELD()任务切换。taskENTER_CRITICAL()进入临界区,用于任务中。taskEXIT_CRITICAL()退出临界区,用于任务中。taskENTER_CRITICAL_FROM_ISR()进入临界区,用于中断服务函数中。taskEX原创 2021-08-23 11:31:39 · 210 阅读 · 0 评论 -
【FreeRTOS】6.STM32移植-系统运行时间统计
vTaskGetRunTimeStats()FreeRTOS 可以通过相关的配置来统计任务的运行时间信息, 任务的运行时间信息提供了每个任务获取到 CPU 使用权总的时间。函数 vTaskGetRunTimeStats()会将统计到的信息填充到一个表里面,表里面提供了每个任务的运行时间和其所占总时间的百分比 。函 数 vTaskGetRunTimeStats() 是 一 个 很 实 用 的 函 数 , 要 使 用 此 函 数 的 话 宏configGENERATE_RUN_TIME_STATS 和 co原创 2021-08-23 11:29:56 · 1009 阅读 · 0 评论 -
【FreeRTOS】5.STM32移植-任务信息查询和信息统计
API函数:UBaseType_t uxTaskPriorityGet(TaskHandle xTask)查询任务优先级uxTaskPrioritySet(TaskHandle xTask)设置任务优先级。供系统内核使用,用户避免通过此函数修改优先级。uxGetNumberOfTask()获取任务个数。uxTaskGetSystemState()获取系统中所有函数的任务状态,每个任务的状态信息保存在TaskState_t 类型的结构体里面。此结构体包含了任务句柄、任务名字、堆栈、优先级等信息原创 2021-08-23 11:28:42 · 340 阅读 · 0 评论 -
【FreeRTOS】3.STM32移植-中断管理理论
STM32提供了中断管理的嵌套向量中断控制器(NVIC)Cotex-M3和M4最多支持240+的IRQ,一个不可屏蔽中断(NMI),一个滴答定时器中断和多个系统异常。CM3中,数字越小,优先级越高。三个系统的中断为负数,优先级最高。 支持3个固定的高优先级和多达256级的可编程优先级,支持128抢占。绝大多数芯片会精简设计,裁掉低端的有效位。如果使用三位表达优先级,低的5位会被裁掉,读值都是0.7到3,对应0到4。STM32只用了高四位表示优先级。裸机实现一般用的事组2优先级,即7,6表示抢占优原创 2021-08-11 09:09:34 · 268 阅读 · 0 评论 -
【FreeRTOS】2.STM32移植-任务挂起和恢复
u :代表unsigned。s :代表short。c :char。所以类似uc,us类的变量就是unsigned char,unsigned short,分别对应uint8_t,uint16_t。x :为用户自定义的数据类型,比如结构体,队列等。常看到ux开头的函数,就是unsigned且用户自定义的类型。需要注意的是size_t变量前缀也是ux。e :枚举变量p :指针变量类似(uint16_t *)变量前缀为pus。prv :static函数v: void函数挂起:原创 2021-08-11 09:02:43 · 152 阅读 · 0 评论 -
【FreeRTOS】1.STM32移植-跑马灯程序
stm32移植FreeRTOS后的跑马灯程序vTaskStartScheduler(); //开启任务调度xTaskCreate 创建任务任务函数格式: void vTaskCode( void * pvParameters ) { // The parameter value is expected to be 1 as 1 is passed in the // pvParamete原创 2021-08-11 08:58:50 · 381 阅读 · 0 评论