RTOS学习记录1:任务调度

RTOS:实时操作系统

实时性:在固定时间内对事件进行响应

操作系统:对任务管理和协调的控制功能

终端:运行于特定的嵌入式硬件,功能可裁剪,代码可移植

  • 堆:malloc和free
  • 栈:保存返回地址、局部变量

修改官方源码,添加串口打印功能:

  • 去掉无关的代码:LCD等
  • 增加串口打印功能
    • 初始化串口
    • 实现fputc

第一个freertos程序及引申

  • 两个打印任务
  • xTaskCreate()函数

xTaskCreate(Task1Function,"Task1",100,NULL,1,&xHandleTask1);定义了task1function和xhandletask1  

    BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
                            const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
                            const configSTACK_DEPTH_TYPE usStackDepth,
                            void * const pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t * const pxCreatedTask )
  •  感觉在并行执行,实际上是交叉执行了task1和task2

  • 作业:加入第三个任务led闪烁(完成)

  数据类型:每个移植的版本都包括portmacro.h,里面包含了TickType_t(事件中断次数)和BaseType_t(对应架构最高效的数据类型)

创建任务函数详解:

  •  动态内存的使用
    •   面向对象的编程思想
      •   struct student
      • TCB_T结构体
  • 静态创建任务
    • 使用静态的createTaskstatic
    • 事先分配好任务控制块
    • 事先提供栈
  • 简单实验
    • 删除任务:需要一个handle句柄
    • 使用同一个task函数实现不同的任务,通过参数来实现
    • 栈的大小 
      •  使用大量的局部变量会破坏TCB,volatile关键字导致buf不能被优化,然后在task1中将buf数组全部置零,会产生error
  • 任务状态:
  • 状态转换图:

    • running
    • ready
    • blocked:阻塞状态,等待某事
    • suspended: 暂停状态,主动休息或被动休息
  • 如何管理不同状态的任务:放在不同的链表中
    • Task1: vTaskSuspend(Task3)
    • Task2: vTaskDelay(10),自身延迟10个时钟
    • Task3
  •  周期性执行:vTaskDelayUntil()

空闲任务及其钩子函数

任务自杀之后,不能自己完成内存清理,必须由空闲task来进行清理。 可以用空闲任务的钩子函数来进行这些任务

任务调度算法:

事件分为两类:

1.时间相关的事件:

  设置超时时间:在指定时间内阻塞,时间到了就进入就绪状态

  实现周期性的功能和超时功能

2.同步事件:某个任务在等待某些信息,别的任务或者中断服务程序给它发消息

调度算法:

 关键在于三点:

1.是否抢占

2.允许抢占时,是否允许时间片轮转

3.允许抢占、允许时间片轮转时,空闲任务是否让步?

posted @   zxkic  阅读(107)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示