2021-11-27-RTOS学习

发布时间 2023-09-17 19:47:06作者: Yecgaa1
layout: post
title: RTOS学习
categories: 日志
tags: 
    - 日志 
    - 大二
BGImage: 'https://github.xutongxin.me/https://raw.githubusercontent.com/xutongxin1/PictureBed/master/img0/20220310123346.png'
jekyll-theme-WuK:
    musicid: '34367899'

中断函数中必须使用带FromISR后缀的API函数!

如xTaskResumeFromISR()

但是定时器vTaskDelay没有FromISR版本

即不可以在中断用延时

任务常见创建后在任务函数内,除非使用删除任务函数,否则该函数不能return。否则会触发如下错误

assert failed: prvTaskExitError port.c:165 (uxCriticalNesting == ~0UL)

解决方案:要不就while(1),否则就用任务删除函数

https://www.cnblogs.com/429512065qhq/p/8041990.html

vTaskDelay

不会使全局阻塞的同时进行计时

vTaskDelay(1000/portTICK_RATE_MS );

1000才是你要计的时

#define portTICK_RATE_MS portTICK_PERIOD_MS
#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )
#define configTICK_RATE_HZ						(200)    

说明:心跳频率是200hz,那么时间片是5ms。那么,vTaskDelay(1000/portTICK_RATE_MS );就是延迟200个时间片,也就是延迟1s。这就是一秒钟的由来。

xTaskCreate

创建动态任务(静态任务即指任务栈需要自己定义分配空间的,使用xTaskCreatestaic,一般不用)

实例

static TaskHandle_t AppTaskCreate_Handle = NULL;//创建任务句柄

xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,/* 任务入口函数 */ 
(const char* )"AppTaskCreate",/* 任务名字 */ 
(uint16_t )512, /* 任务栈大小 */ 
(void* )NULL,/* 任务入口函数参数 */  
(UBaseType_t )1, /* 任务的优先级 */
(TaskHandle_t*)&AppTaskCreate_Handle));/*任务控制块指针*/

/* 启动任务调度 */ 
if (pdPASS == xReturn)
vTaskStartScheduler();
/* 启动任务,开启调度 */

完整案例见附录

vTaskStartScheduler

启动任务调度函数,启动了xTaskCreate创建的任务才会开始跑,相当于启动状态机

taskENTER_CRITICAL与taskEXIT_CRITICAL临界函数

代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断。为确保临界段代码
的执行不被中断,在进入临界段之前须关中断,而临界段代码执行完毕后,要立即开中断。

任务状态

image-20211127222438503

image-20211127222453972

就绪:等待干的活

运行:正在干活

阻塞:等待信号来干活

挂起:用户不让他干活

附录

RTOS启动实例

image-20211127221302614

image-20211127221336923

image-20211127221340248

image-20211127221343054