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临界函数
代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断。为确保临界段代码
的执行不被中断,在进入临界段之前须关中断,而临界段代码执行完毕后,要立即开中断。
任务状态
就绪:等待干的活
运行:正在干活
阻塞:等待信号来干活
挂起:用户不让他干活
附录
RTOS启动实例