RTOS笔记

来源:互联网 发布:网络骗局大全微信视频 编辑:程序博客网 时间:2024/06/14 01:26

固定优先级抢占式调度:

  • 每个任务都被赋予了一个优先级,该优先级只能被任务修改,不能被内核本身修改
  • 每个任务都可以存在于一个或多个状态
  • 在任何时候都只有一个任务可以处于运行状态
  • 调度器总是在处于就绪态的任务中选择具有最高优先级的任务来执行


抢占式:是指任务进入就绪态或者优先级被修改时,如果处于运行态的任务优先级更低,那么该任务总是抢占当前运行任务。


调度策略:

1、单调速率调度:根据任务周期性执行速率来分配一个唯一的优先级,具有最高周期执行频率的任务赋予高优先级。

  • 可以最大化整个应用程序的可调度性
  • 由于运行时间不定和并非所有任务都具有周期性,导致全面计算复杂


2、协作式调度:(FreeRTOS)

只能在运行态任务进入阻塞态或者运行态任务显示调用taskYIELD()时,才进行上下文切换,任务永远不会被抢占,而具有相同优先级的任务也不会自动共享处理器时间。

  • 操作简单
  • 导致系统响应不够快

=============================================================================================================


队列管理

读队列时阻塞:任务试图读一个队列时,可以指定阻塞超时时间。

如果队列为空,任务保持阻塞状态知道队列数据有效。当队列被写入数据,该任务将自动从阻塞态转为就绪态。

当等待时间超过了阻塞时间,即使队列中无数据,任务也自动从阻塞态转换为就绪态。

写队列时阻塞:指定阻塞超时时间,当写队列已满时,任务进入阻塞态以等待队列空间有效的最长时间。


备注:在FreeRTOS中,千万不要在中断服务程序中调用xQueueSendToFront()或者xQueueSendToBack(),而是调用xQueueSendToFrontFromISR()或者xQueueSendToBackFromISR()。


如果队列存储的数据单元尺寸比较大,最好利用队列来传递数据的指针,而不是对数据本身在队列上的一个字节一个字节的拷贝。注意以下两点:

1、指针指向内存空间的所有权必须明确,保证不会有任意两个任务同时修改共享内存中的数据。

原则上,共享内存其指针发送到队列之前,其内容只允许发送任务访问;

共享内存其指针从队列被读出之后,其内容只允许接收任务访问;

2、指针指向的内存空间必须有效

若指针指向的内存空间是动态分配,应该只有一个任务负责对其内存释放,释放后,不应有任务访问这段空间。

切忌用指针访问任务栈上分配的空间,因为当栈帧改变后,栈上的数据将不再有效。


=====================================================================================================================


中断管理

FreeRTOS中,0为最低优先级;

FreeRTOS中,只有"FromISR"结束的API函数或者宏才可以在中断服务程序中。


信号量用途:

1、事件计数:

计数值初始化为0,信号量的计数值是已发生的事件的数目与已处理的事件的数目之间的差值

2、资源管理:

计数值初始化为可用资源总数,用于表示可用资源的数目。

一个任务要获取资源的控制权,必须先获得信号量,使信号量的计数值减1。计数值0表示无可用资源。

任务使用资源结束后,将计数值加1.







0 0
原创粉丝点击