标签:color ack 框架 sign err init port initial 不同
FreeRTOS Posix原理
1. FreeRTOS源码原理
FreeRTOS可以创建不同优先级的task,RTOS负责管理这些任务。同时提供了队列、信号等功能,这些功能能够使task再不满足条件时挂起,当运行条件满足时触发运行。
RTOS依据不同的优先级,创建不同任务链表,相同优先级的任务挂在同一链表中。RTOS要求每当中断退出、主动调度yield或者任务创建删除时,进行任务切换。任务切换时,RTOS提供选择需要运行任务vTaskSwitchContext(),由port.c实现任务切换。
void vPortYield( void ) { xTaskToSuspend = prvGetThreadHandle( xTaskGetCurrentTaskHandle() ); vTaskSwitchContext(); xTaskToResume = prvGetThreadHandle( xTaskGetCurrentTaskHandle() ); prvResumeThread( xTaskToResume ); prvSuspendThread( xTaskToSuspend ); }
由上面框架可知,任务的优先级调度是有RTOS实现,port.C只要保证依据RTOS返回需要运行程序正常运行,挂起需要暂停的程序即可。
2. FreePort posix原理
每个任务对应一个线程,参考pxPortInitialiseStack()创建线程过程。
任务和线程进行绑定,参考vPortAddTaskHandle()。
每个线程依赖线程信号量进行挂起和暂停操作,参考prvSuspendSignalHandler()和prvResumeSignalHandler()。
系统tick中断创建,参考prvSetupTimerInterrupt()。
每个tick中断,中断退出,yield函数,都会进行任务切换。参考vPortYield()。
这样,就由FreeRTOS管理不同线程的切换了。
标签:color ack 框架 sign err init port initial 不同
原文地址:https://www.cnblogs.com/TheImportanceOfLiving/p/13174818.html