如有错误,欢迎指正,谢谢!
目录
- 一、FreeRTOS的移植
- 二、建立一个基本的多任务程序
-
一、FreeRTOS的移植
-
教程(视频):野火 FreeRTOS视频教学 配套书籍《FreeRTOS内核实现与应用开发实战指南》配套例程源码
-
流程图
-
提取最简源码
包含以下部分
首先要确定自己的芯片类型,我才用的是野火指南者,故采用ARM_CM3中的文件。
各个文件的来源如下:
最好还要把FreeRTOS.h加入我们模板的user中,
按先前的图片的顺序加入文件夹,并导入keil中
-
设置对应的路径
-
将模板的文件stm32f10x_it.c中的以下两个函数注释掉
-
将FreeRTOSConfig.h进行配置(我也不知道配置了个啥,大致就是用野火的文件把官方文档中的替换掉)
二、建立一个基本的多任务程序
1、实验要求
在STM32下完成一个基于FreeRTOS的多任务程序,执行3个周期性task,具体任务不限,但建议如下:task1,每间隔500ms闪烁(变化)一次LED;task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。
注:目前还没有买AHT20芯片,故先执行2个task,去掉传感器部分
2、代码设计
1、功能代码
LED模块:
static void LED1_Task(void* parameter)
{
while (1)
{
LED1_ON;
vTaskDelay(500);
printf("LED1_Task Running,LED1_ON\r\n");
LED1_OFF;
vTaskDelay(500);
printf("LED1_Task Running,LED1_OFF\r\n");
}
}
发送模块:
static void send_Task(void* parameter)
{
while (1)
{
Usart_SendString( DEBUG_USARTx,"hello world!\n");
vTaskDelay(2000);
}
}
任务管理模块:
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL();
xReturn = xTaskCreate((TaskFunction_t )LED1_Task,
(const char* )"LED_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )2,
(TaskHandle_t* )&LED1_Task_Handle);
if(pdPASS == xReturn)
printf("´´½¨LED1_TaskÈÎÎñ³É¹¦!\r\n");
xReturn = xTaskCreate((TaskFunction_t )send_Task,
(const char* )"send_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )3,
(TaskHandle_t* )&send_Task_Handle);
if(pdPASS == xReturn)
printf("´´½¨send_TaskÈÎÎñ³É¹¦!\r\n");
vTaskDelete(AppTaskCreate_Handle);
taskEXIT_CRITICAL();
}
不知道为啥keil复制粘贴注释过来会乱码,再附上下图,方便查看注释
主函数:
int main(void)
{
BaseType_t xReturn = pdPASS;
BSP_Init();
printf("ÕâÊÇÒ»¸ö[Ò°»ð]-STM32ȫϵÁпª·¢°å-FreeRTOS-¶¯Ì¬´´½¨¶àÈÎÎñʵÑé!\r\n");
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);
}
3、执行效果
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)