最近在搞车和准备RM比赛,学习RTOS。我想是我们主要用的就是函数,主要是记函数与实际用的区别

基本概念(不全,留有印象)

RTOS的栈概念 保存现场就是保存被切换瞬间的所有寄存器
每个任务都有自己的调用关系,栈,自己的局部变量,自己的现场(所有的CPU寄存器)。这些都是要计算的栈大小。

内存管理-堆分频-------

heap_5.c里面有片外外设。视频地址
函数出现
xPortGetFreeHeapSize();

xPortGetMinimumEverFreeHeapSize()
vApplicationMallocFailedHook()
创建任务————
xTaskCreate()
使用示例
void Mytask(void *argument)
{
while(1)
{}
}TaskHandle_t xSoundTaskHandle;//任务句柄
BaseType_t ret;//分辩返回值,可以不要 ret=xTaskCreate(Mytask,"myfirsttask",128,NULL,osPriorityNormal,&xSoundTaskHandle);//内存没有计算功能,这里的128是字节

动态自动分频结构体和栈
xTaskCreatestatic()
首先准备好栈和结构体
使用示例
static uint32_t g_puStackofLinghtTak[128];//传进去的大小是字为单位
//如果是uint8 就是128*4。32位就不用*4了
static StaticTask_t g_TCBofLightTask;
static TaskHandle_t xSoundTaskHandle;//任务返回的是句柄或者是NULL xSoundTaskHandle=xTaskCreateStatic(Mytask,"myfirsttask",128,NULL,osPriorityNormal,g_puStackofLinghtTak,&g_TCBofLightTask);//这里的128是指128字
估算任务栈的大小
栈的计算:
1返回地址LR,其他Reg:取决于函数的调用深度(5级调用*被调用者寄存器R4到R11共8个寄存器还有LR)5*9*4(byte)
2局部变量:char,int
3现场:16(寄存器)*4=64byte
创建任务知识点--提供不同的任务参数
使用同一个创建不同的任务,为了更好的说明问题我们还是看视频(本来就是基于视频做的总结)
我只将其中重要的代码抄出来做总结,当然是我个人的总结。
static struct TaskPrintInfo g_Task1Info={0,0,"Task1"};
static struct TaskPrintInfo g_Task2Info={0,3,"Task2"};
static struct TaskPrintInfo g_Task3Info={0,6,"Task3"};
static int g_LCDCANuse=1;//想达成目的一个在显示的时候另一个不能显示
void LcdPrintTask(void *params)
{
struct TaskPrintInfo *pInfo= params;
uint32_t cnt=0;
int len;
while(1)
{
if(g_LCDCANuse)
{
g_LCDCANuse=0;//占时很短
/*打印信息*/
len=LCD_PrintString(pInfo->x,pInfo->y,pInfo->name);
len+=LCD_PrintString(len,pInfo->y,":");
LCD_PrintSignedVal(len,pInfo->y,cnt);
g_LCDCANuse=1;//占时很短
}
mdelay(500)//简单的延时函数,占while切换的时间。不加还不行,不然while里面只有if,那就只有task3在运行
}
}
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
TaskHandle_t xSoundTaskHandle;
BaseType_t ret;
/* USER CODE END Init */
/* USER CODE BEGIN RTOS_MUTEX */
/* add mutexes, ... */
/* USER CODE END RTOS_MUTEX */
/* USER CODE BEGIN RTOS_SEMAPHORES */
/* add semaphores, ... */
/* USER CODE END RTOS_SEMAPHORES */
/* USER CODE BEGIN RTOS_TIMERS */
/* start timers, add new ones, ... */
/* USER CODE END RTOS_TIMERS */
/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
/* USER CODE END RTOS_QUEUES */
/* Create the thread(s) */
/* creation of defaultTask */
//defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* 创建任务: 声 */
// extern void PlayMusic(void *params);
// ret = xTaskCreate(PlayMusic, "SoundTask", 128, NULL, osPriorityNormal, &xSoundTaskHandle);
// /* 创建任务: 光 */
// xLightTaskHandle = xTaskCreateStatic(Led_Test, "LightTask", 128, NULL, osPriorityNormal, g_pucStackOfLightTask, &g_TCBofLightTask);
// /* 创建任务: 色 */
// xColorTaskHandle = xTaskCreateStatic(ColorLED_Test, "ColorTask", 128, NULL, osPriorityNormal, g_pucStackOfColorTask, &g_TCBofColorTask);
/* 使用同一个函数创建不同的任务 */
xTaskCreate(LcdPrintTask,"task1",128,&g_Task1Info,osPriorityNormal,NULL);
xTaskCreate(LcdPrintTask,"task2",128,&g_Task2Info,osPriorityNormal,NULL);
xTaskCreate(LcdPrintTask,"task3",128,&g_Task3Info,osPriorityNormal,NULL);
/* USER CODE END RTOS_THREADS */
/* USER CODE BEGIN RTOS_EVENTS */
/* add events, ... */
/* USER CODE END RTOS_EVENTS */
}
提问:如何互斥地访问LCD?使用全周变量,大概率可以,但是不是万无一失
提问:为何是后面创健的task3先运行?
删除任务函数————
vTaskDelete(句柄);
举例说明
TaskHandle_t xSoundTaskHandle = NULL;//句柄初始化
if (xSoundTaskHandle == NULL)//如果句柄没被创建,就创建任务
{
LCD_ClearLine(0, 0);
LCD_PrintString(0, 0, "Create Task");
RTOS开发函数与机制总结

最低0.47元/天 解锁文章
904

被折叠的 条评论
为什么被折叠?



