RTOS入门

发布时间 2023-08-23 11:33:58作者: __Zed

RTOS是什么?

RTOS是一款操作系统,相当于Windows\Linux

分为ucos FreeRTOS RT-Thread LiteOS

比裸机开发的优势在于,多任务系统,不必串行

任务

单片机写在一个while(1)里,RTOS是内核调度执行。
image

  • 还有一个挂起状态,挂起状态下调度器不可见,如果一个任务较长时间不运行就把他挂起,否则阻塞的话还加个超时判断

临界区

  • 临界区就是一段执行时不可被打断的代码
  • 操作全局变量不可被打断
  • 临界区的不可被打断机制,导致他不能运行太久,否则会阻塞程序

目录结构

源码放在FreeRTOS/Source文件夹下

image

  • portable是需要特殊处理适配的
  • include是包含的头文件

代码规范

数据结构

对常见的c语言数据结构重定义

1. #define portCHAR        char  
2. #define portFLOAT       float  
3. #define portDOUBLE      double  
4. #define portLONG        long  
5. #define portSHORT       short  
6. #define portSTACK_TYPE  uint32_t  
7. #define portBASE_TYPE   long  
1. typedef int            int32_t;  
2. typedef short          int16_t;  
3. typedef char           int8_t;  
4. typedef unsigned int   uint32_t;  
5. typedef unsigned short uint16_t;  
6. typedef unsigned char  uint8_t;

事实上,上述都是定义在stdint.h中的,因不同的系统Linux\Window\MacOS\RTOS有所不同,作用就是确保不同平台上都精确的占对应的位,占对应的字节(8位一字节)

变量定义

  • char 型变量的前缀是 c

  • short 型变量的前缀是 s

  • long 型变量的前缀是 l

  • 复杂的结构体,句柄等定义的变量名的前缀是 x

  • 变量是无符号型的再加前缀 u,是指针变量则加前缀 p

函数取名

  • 私有函数前加prv

  • 返回值void,前缀v

#define taskYIELD() 表示宏定义在task.h下

任务

 ret = xTaskCreate((TaskFunction_t) master_task_main,  /* 任务入口函数 */(1)
                   “MASTER”,   /* 任务名字 */(2)
                   64*1024,   /* 任务栈大小 */(3)
                   NULL,    ,/* 任务入口函数参数 */(4)
                   TASK_PRIORITY_NORMAL,  /* 任务的优先级 */(5)
                   &task_master_handler);  /* 任务句柄指针 */(6)
  • 任务入口函数,是个函数指针,指向要执行的任务。
  • 任务描述名称,字符串形式,最大长度由 FreeRTOSConfig.h 中定义的 configMAX_TASK_NAME_LEN 宏指定,多余部分会被自动截掉,只是方便调试。
  • 任务堆栈大小,单位为字, 4 个字节 uint32_t,这个要注意,否则系统内存紧缺。
  • 任务入口函数形参,不用的时候配置为 0 或者NULL 即可。
  • 任务的优先级,数值越大优先级越高,0 代表最低优先级。基于其SDK开发,可将自定义的所有业务功能task设为同一个优先级,按时间片轮询调度。
  • 任务句柄指针,作用是可以恢复、挂起、删除等等,目前还不知道怎么实现的,也可以直接NULL。

迷糊的一点

void func(){};
void (*p)  () = func;

后面可以用p代替func,func代替不了p

  • 但不可以直接void (* p)(){}写函数体,因为这样函数就没名字了

任务调度的时候第一个参数可以填p或&func