FreeRTOS入门部分操作
一.任务要求:
学习FreeRTOS原理,在STM32下完成一个基于FreeRTOS的多任务程序,执行3个周期性task,具体任务不限,但建议如下:task1,每间隔500ms闪烁(变化)一次LED;task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。
二.FreeRTOS移植
1.FreeRTOS简介:
FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。
由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对μC/OS-II、embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行,其最新版本为10.3.1版。
FreeRTOS是其中应用最为广泛的一种,开源免费,源码和相应的官方书籍均可从官网 www.freertos.org 获得。
2.参考资料下载
资料下载:下载链接.提取码:pmf1
也可参考官网源码:官网.
解压,打开文件夹
FreeRTOS和FreeROS-Plus里都是其源码,请自行查看
进入文件后,他会提供各种各样器件的例子,我们这里使用的是stm32f103
打开如图所示
进入后点击下面所需的文件
FreeRTOSv9.0.0\FreeRTOSv9.0.0\FreeRTOS\Source\portable\RVDS\ARM_CM3 这个目录下的文件也是我们需要的
3.移植操作
(1)打开文件夹中的keil工程文件
(2)打开后,文件显示如下:
可以看到,此时的该工程文件已完成拷贝 FreeRTOS Package 到裸机工程,FreeRTOSConfig.h 文件到 user 文件夹的工作,无需手动添加。FreeRTOS/src 和 FreeRTOS/port 组也已建立完成。
此时在main.c主程序下去看,包含硬件初始化以及创建任务
(3)打开main.c函数找到任务句柄部分
(4)创建任务
/* 创建任务句柄 */
static TaskHandle_t AppTaskCreate_Handle = NULL;
/* 创建LED1句柄 */
static TaskHandle_t LED1_Task_Handle = NULL;//task1,每间隔500ms闪烁(变化)一次LED;
/* 创建hello句柄 */
static TaskHandle_t hello_Task_Handle = NULL;//task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";
/* 创建AHT20句柄 */
static TaskHandle_t AHT_Task_Handle = NULL;//task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。
(5)创建结果
(6)在主程序中添加代码
(在主程序中添加hello任务)
xReturn = xTaskCreate((TaskFunction_t )hello_Task,
(const char* )"hello_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )3,
(TaskHandle_t* )&hello_Task_Handle);
if(pdPASS == xReturn)
printf("创建hello任务成功!\r\n");
(在主程序中添加AHT20任务)
xReturn = xTaskCreate((TaskFunction_t )AHT_Task,
(const char* )"AHT_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )3,
(TaskHandle_t* )&AHT_Task_Handle);
if(pdPASS == xReturn)
printf("创建AHT20任务成功!\r\n");
(再添加如下两个函数)
static void hello_Task(void* parameter)
{
while (1)
{
vTaskDelay(2000);
printf("hello World!\n");
}
}
static void AHT_Task(void* parameter)
{
/*暂无*/
}
(修改完成后主程序如下)
#include "FreeRTOS.h"
#include "task.h"
#include "bsp_led.h"
#include "bsp_usart.h"
static TaskHandle_t AppTaskCreate_Handle = NULL;
static TaskHandle_t LED1_Task_Handle = NULL;
static TaskHandle_t hello_Task_Handle = NULL;
static void AppTaskCreate(void);
static void LED1_Task(void* pvParameters);
static void hello_Task(void* pvParameters);
static void AHT_Task(void* pvParameters);
static void BSP_Init(void);
int main(void)
{
BaseType_t xReturn = pdPASS;
BSP_Init();
printf("这是一个多任务实验\r\n");
xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,
(const char* )"AppTaskCreate",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )1,
(TaskHandle_t* )
if(pdPASS == xReturn)
vTaskStartScheduler();
else
return -1;
while(1);
}
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL();
xReturn = xTaskCreate((TaskFunction_t )LED1_Task,
(const char* )"LED1_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )2,
(TaskHandle_t* )&LED1_Task_Handle);
if(pdPASS == xReturn)
printf("创建LED灯任务成功!\r\n");
xReturn = xTaskCreate((TaskFunction_t )hello_Task,
(const char* )"hello_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )3,
(TaskHandle_t* )&hello_Task_Handle);
if(pdPASS == xReturn)
printf("创建hello任务成功!\r\n");
vTaskDelete(AppTaskCreate_Handle);
taskEXIT_CRITICAL();
}
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 hello_Task(void* parameter)
{
while (1)
{
vTaskDelay(2000);
printf("hello World!\n");
}
}
static void BSP_Init(void)
{
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
LED_GPIO_Config();
USART_Config();
}
(7)修改完成后,编译运行
(7)进入设置,使其成功生成hex文件
4.程序烧录进stm32
接下来通过usb将程序烧录到指南者板子里,过程如下:
(1)首先利用USB线将板子与上位机连接(连“usb转串口”)
(2)安装ch340驱动,并且安装mcuisp软件
(刚才下载的资料里面有)
(3)在mcuisp中进行配置并导入刚才修改完代码的hex文件如下
(4)进行对代码的编程,板子变化如下,第一个LED任务执行成功
(5)在野火资料包中下载野火串口调试助手v1.0.1.5双击运行,设置串行口调试设置特率为115200,1位停止位,无校验位。点击打开串口,程序运行如下
三.总结
本次实验通过在stm32硬件上完成FreeRTOS的移植以及多任务程序,使我对相关的软硬件知识有了更深刻的认识,特别是对硬件的一个连接,烧录程序操作。