• FreeRTOS开始的宏和任务状态


    目录

    “INCLUDE”开始的 宏

     "config"开始的宏

    FreeRTOS任务特性

    四种任务状态(任务调度器)

    FreeRTOS任务优先级

    FreeRTOS任务控制块

    FreeRTOS任务堆栈


    “INCLUDE”开始的 宏

    使用 “include”开始的宏 表示使能或者除能 FreeRTOS 对应的 API 函数

    配置可选的FreeRTOS 的API函数

    例如

     "config"开始的宏

     “config” 和“include”开始的宏 都表示使能或者除能 FreeRTOS 对应的 API 函数 配置可选的FreeRTOS 的API函数

    FreeRTOS任务特性

    1. 任务简单
    2. 任务没有数量使用限制
    3. 任务支持抢占(抢占式内核)
    4. 任务支持 优先级
    5. 每个任务都有堆栈 导致RAM使用量增大(比如任务A在运行的过程中,运行到一半去跳转执行另一个任务B的过程中,任务A就要保存它的上下文,这个时候就会存储到相对应的堆栈当中,再去执行B,这样的话A,B堆栈都会保留在CPU中,会导致RAM使用量增大)
    6. 如果使用抢占的话 必须 仔细 的考虑 重入问题 (优先级一定要配置好)

    四种任务状态(任务调度器)

    1. 1 运行态 :一个程序运行 的状态
    2. 2 就绪态 :一个程序准备运行 能够执行的状态。
    3. 3 阻塞态:等待一个临时的事件 任务就处于阻塞态 不会占用cpu的任何时间。
    4. 4 挂起态:与处于阻塞态的任务一样,处于挂起态的任务不能被调度器调度,
    5. 处于挂起态的任务没有超时时间。

     我们切换任务是由我们的任务调度器去调整他的一个任务当前到什么状态以及下一个状态是什么,也就是我们的抢占式内核(可剥夺式内核决定)

    FreeRTOS任务优先级

    1. 任务优先级决定了任务的执行优先级别,在FreeRTOS中优先级可选范围位:
    2. 0 ~ configMAX_PRIORITIES-1 (0~32-1) 31
    3. 数字越大,优先级越高
    1. 任务实现即为任务的具体工作内容
    2. void vATaskFuntion(void *pvParameters )
    3. {
    4. for(;;)
    5. {
    6. --任务应用程序-- vTaskDelay(); /*不能从任务函数中直接退出, 否则会调用configASSERT(),要退出一定要调用vTaskDelete(NULL)删除此任务。*/
    7. }
    8. vTaskDelete(NULL);
    9. }

    FreeRTOS任务控制块

    1. 描述任务属性的数据结构称为任务控制块,称为TCB_t.
    2. typedef struct tskTaskControlBlock
    3. {
    4. volatile StackType_t * pxTopOfStack;
    5. #if ( portUSING_MPU_WRAPPERS == 1 )
    6. xMPU_SETTINGS xMPUSettings;
    7. #endif
    8. ListItem_t xStateListItem;
    9. ListItem_t xEventListItem; UBaseType_t uxPriority;
    10. StackType_t * pxStack;
    11. } tskTCB
    12. typedef tskTCB TCB_t;

    FreeRTOS任务堆栈

    1. 任务堆栈用来保存任务现场(CPU寄存器值),创建任务的时候需要指定任务堆栈,(每个任务都有独立的堆栈大小)
    2. 任务堆栈的变量类型为 StackType_t ,此变量类型如下:
    3. #define portSTACK_TYPE uint32_t (四个字节)因为是32位所以定义的都是乘以4的字节数
    4. #define portBASK_TYPE long
    5. #define portSTACK_TYPE StackType_t

    32位四个字节,这里就遇到一个问题,正常任务堆栈大小设置为128所以要乘以4等于128*4个字节,50*4=200个字节 

    如果任务这里定义一个数组u8 test[500];说明这里有500个字节,而我们只有50*4=200个字节的话显然是不够的,所以要根据实际情况给他设定堆栈大小

     

     我们在config.h文件里也有堆栈大小配置

     

  • 相关阅读:
    VSCode中文件在新窗口打开 | Always Open A File In New Tab in VSCode
    看看阿里文娱怎么建设开放平台,这就是专业~
    常用基本AT指令
    LeetCode-17-电话号码的字母组合
    【Python数据结构与算法】--- 递归算法应用-五行代码速解汉诺塔问题.
    情侣纪念日网站html5源码教程
    Dubbo环境搭建
    30行python代码实现“代码雨”
    python在线及离线安装库
    【基于Qt和OpenCV的多线程图像识别应用】
  • 原文地址:https://blog.csdn.net/Paradise_Violet/article/details/126291720