发布时间:2023-09-08 09:00
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
在读书的时候,ucos ii是学习的最多的rtos。但是在实际开发中,freertos使用最多。这当中估计还是商业的因素占了很大的比例,毕竟freertos本身是开源的操作系统,没有版权的问题,可以在商业产品中自由使用。
在mcu上面使用freertos很常见,github上也有很多的范例可以学习。学习freertos不在于学习设计os本身,而在于使用它。当然,如果学有余力,学习一下rtos源代码也是可以的,至少对于提高自己的debug水平是很有帮助的。
1、下载关联的rtos代码
git clone https://github.com/Embedfire-freertos/ebf_freertos_peripheral_code_stm32f103_zhinanzhe.git
2、打开对应led项目
选择项目01-FreeRTOS-LED即可
3、打开工程
4、分析main函数
int main(void)
{
BaseType_t xReturn = pdPASS;
BSP_Init();
xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,
(const char* )\"AppTaskCreate\",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )1,
(TaskHandle_t* )&AppTaskCreate_Handle);
if(pdPASS == xReturn)
vTaskStartScheduler();
else
return -1;
while(1);
}
如代码所示,主要有三个部分组成。第一个部分是BSP_Init(),准备硬件环境;第二个部分是创建一个AppTaskCreate的线程;第三个是启动os,也就是调用vTaskStartScheduler函数。
5、BSP_Init初始化
static void BSP_Init(void)
{
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
LED_GPIO_Config();
USART_Config();
}
BSP初始化的部分非常简单,主要就是初始化中断、LED初始化和串口初始化三部分。
6、第一个创建的os任务
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL();
xReturn = xTaskCreate((TaskFunction_t )LED_Task,
(const char* )\"LED_Task\",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )2,
(TaskHandle_t* )&LED_Task_Handle);
if(pdPASS == xReturn)
printf(\"OK \\r\\n\");
vTaskDelete(AppTaskCreate_Handle);
taskEXIT_CRITICAL();
}
如上面代码所示,这是我们创建的第一个os任务。这个任务的主要工作其实就是创建一个LED_Task。注意,任务创建好之后,LED_Task没有立即执行,因为AppTaskCreate的优先级是1,LED_Task的优先级是2,所以AppTaskCreate继续执行。当然创建好这个任务,它就调用vTaskDelete把自己从调度队列中删除了,并且在调用taskEXIT_CRITICAL的时候触发中断,准备切换到LED_Task。
7、第二个创建os任务
static void LED_Task(void* parameter)
{
while (1)
{
LED1_ON;
vTaskDelay(500);
printf(\"LED_Task Running,LED1_ON\\r\\n\");
LED1_OFF;
vTaskDelay(500);
printf(\"LED_Task Running,LED1_OFF\\r\\n\");
}
}
除了free rtos的idle空闲任务,这是唯一一个有意义的任务。它的工作其实就是一个死循环操作,LED点灯、延时、打印、LED灭灯、延时、打印,循环往复,没有终点。
【JavaScript 进阶教程】数组新增遍历方法的说明与使用
JavaWeb系列——Servlet、JSP、EL表达式、JSTL标签库、Filter过滤器、Listener监听器
Windows 10下安装Qt5.14.2,及与VS2017开发环配置
【本篇更完】ESP 保姆级教程 疯狂传感器篇 —— 案例:ESP8266 + DHT11 + 串口输出(检测温湿度)
【数独 1】不回溯,试试候选数法1ms高效解数独谜题-C++实现
YOLOv3 -> YOLOv4 -> YOLOv5的改进(tricks)
kafka笔记3--快速部署KRaft版本的kafka3.1.1