FreeRTOS学习总结
听朋友说,FreeRTOS很好用,就在无聊的上网课期间浅学一下
提示:以下是本篇文章正文内容,下面案例可供参考
注意:1.FreeRTOS共有32个优先级(0~31)使用时0和31不使用
2.优先级规则:数字越大优先级越高
3.vTaskDelay();//延迟函数也称任务调度函数
4.退出调用vTaskDelet(NULL)函数
两种方法创建任务:动态和静态
注意:1.任务堆栈字节数实际上= 某数 *4
2.若程序出现卡死状态,注意所设定的堆栈大小
本质是调用API函数
xTaskCreate(): 使用动态方法创建一个任务
xTaskCreateStatic(): 使用静态方法创建一个任务
xTaskCreateRestricted(): 创建一个使用MPU进行限制的任务,相关内存使用动态内存分配
vTaskDelete():删除一个任务
调用xTaskCreate()函数
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint16_t usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )
参数:
pxTaskCode: 任务函数。
pcName: 任务名字,一般用于追踪和调试,任务名字长度不能超过。
configMAX_TASK_NAME_LEN。
usStackDepth: 任务堆栈大小,注意实际申请到的堆栈是 usStackDepth 的 4 倍。其中空闲任
务的任务堆栈大小为 configMINIMAL_STACK_SIZE。
pvParameters: 传递给任务函数的参数。
uxPriotiry: 任务优先级,范围 0~ configMAX_PRIORITIES-1。
pxCreatedTask: 任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄其实就是
任务的任务堆栈。此参数就用来保存这个任务句柄。其他 API 函数可能会使
用到这个句柄
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "timer.h"
#include "FreeRTOS.h"
#include "task.h"
//ÈÎÎñÓÅÏȼ¶
#define START_TASK_PRIO 1
//ÈÎÎñ¶ÑÕ»´óС
#define START_STK_SIZE 128
//ÈÎÎñ¾ä±ú
TaskHandle_t StartTask_Handler;
//ÈÎÎñº¯Êý
void start_task(void *pvParameters);
//ÈÎÎñÓÅÏȼ¶
#define TASK1_TASK_PRIO 2
//ÈÎÎñ¶ÑÕ»´óС
#define TASK1_STK_SIZE 128
//ÈÎÎñ¾ä±ú
TaskHandle_t Task1Task_Handler;
//ÈÎÎñº¯Êý
void task1_task(void *pvParameters);
//ÈÎÎñÓÅÏȼ¶
#define TASK2_TASK_PRIO 3
//ÈÎÎñ¶ÑÕ»´óС
#define TASK2_STK_SIZE 128
//ÈÎÎñ¾ä±ú
TaskHandle_t Task2Task_Handler;
//ÈÎÎñº¯Êý
void task2_task(void *pvParameters);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é4
delay_init(); //ÑÓʱº¯Êý³õʼ»¯
uart_init(115200); //³õʼ»¯´®¿Ú
LED_Init(); //³õʼ»¯LED
//´´½¨¿ªÊ¼ÈÎÎñ
xTaskCreate((TaskFunction_t )start_task, //ÈÎÎñº¯Êý
(const char* )"start_task", //ÈÎÎñÃû³Æ
(uint16_t )START_STK_SIZE, //ÈÎÎñ¶ÑÕ»´óС
(void* )NULL, //´«µÝ¸øÈÎÎñº¯ÊýµÄ²ÎÊý
(UBaseType_t )START_TASK_PRIO, //ÈÎÎñÓÅÏȼ¶
(TaskHandle_t* )&StartTask_Handler); //ÈÎÎñ¾ä±ú
vTaskStartScheduler(); //¿ªÆôÈÎÎñµ÷¶È
}
//¿ªÊ¼ÈÎÎñÈÎÎñº¯Êý
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); //½øÈëÁÙ½çÇø
//´´½¨TASK1ÈÎÎñ
xTaskCreate((TaskFunction_t )task1_task,
(const char* )"task1_task",
(uint16_t )TASK1_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK1_TASK_PRIO,
(TaskHandle_t* )&Task1Task_Handler);
//´´½¨TASK2ÈÎÎñ
xTaskCreate((TaskFunction_t )task2_task,
(const char* )"task2_task",
(uint16_t )TASK2_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK2_TASK_PRIO,
(TaskHandle_t* )&Task2Task_Handler);
vTaskDelete(StartTask_Handler); //ɾ³ý¿ªÊ¼ÈÎÎñ
taskEXIT_CRITICAL(); //Í˳öÁÙ½çÇø
}
//task1ÈÎÎñº¯Êý
void task1_task(void *pvParameters)
{
int i=0;
while(1)
{
i++;
LED0=~LED0;
if(i==5)
{
vTaskDelete(Task2Task_Handler);
}
vTaskDelay(200);
}
}
//task2ÈÎÎñº¯Êý
void task2_task(void *pvParameters)
{
while(1)
{
LED1=0;
vTaskDelay(800);
LED1=1;
vTaskDelay(200);
}
}
了解FreeRTOS操作系统可以多个任务同时执行,感觉很不错,同时在使用的时候也要注意细节!!!
继续加油~