栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > 架构设计

OSAL框架基础以及相关的系统架构实现的原理

架构设计 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OSAL框架基础以及相关的系统架构实现的原理

1、任务的调度
实际就是循环遍历一个任务列表,检查任务的执行状态,可以执行的 就开始执行。循环遍历。
实际就是sfwd的实现原理

两个数组(指针)记录任务的调度
*tasksEvents记录序号从0到taskcnt对应的任务是否被执行;
*tasksArr记录每个任务的入口地址;

for(; // Forever Loop
{
uint8 idx = 0;
Hal_ProcessPoll(); // 先不管1
do {
if (tasksEvents[idx]) // 寻找最高优先级的任务来运行
{
break;
}
} while (++idx < tasksCnt);
if (idx < tasksCnt) //如果有任务需要运行
{
uint16 events;
halIntState_t intState;
HAL_ENTER_CRITICAL_SECTION(intState);
events = tasksEvents[idx];
tasksEvents[idx] = 0; // 本任务运行完了,要对其清空,为后面要运行的任务让路
HAL_EXIT_CRITICAL_SECTION(intState);
events = (tasksArr[idx])( idx, events );//最关键的一句话,如图一中,运行对应的任务
HAL_ENTER_CRITICAL_SECTION(intState);
tasksEvents[idx] |= events; // 本任务可能没完全完成,如果是这样,再次设置标志位,在下一次循环中继续执行
HAL_EXIT_CRITICAL_SECTION(intState);
}
}

2、系统时钟
通过timer4产生系统心跳时钟,1ms的时间

3、消息处理机制
tasksEvents:数组存放了一个任务是否该被运行的序列,其中 osal_set_event的函数是专门来设置tasksEvents的。
osal_set_event:里面包含两个主要的函数 osalTimerUpdate和osal_msg_send。

// When timeout, execute the task
if ( srchTimer->timeout == 0 )
{
osal_set_event( srchTimer->task_id, srchTimer->event_flag );
//上面的程序是定时器溢出之后开始执行osal_set_event函数,

// timeout_value(ms)的计时器,当计时器溢出的时候就会对tackID和task设置一个event_id,让这个任务在主循环中运行


byte osal_start_timerEx( byte taskID, UINT16 event_id, UINT16 timeout_value )

osalTimerUpdate:作用是使得任务在主循环中被运行。
下面就是 osalTimerUpdate函数的“任务表”

osal_start_timerEx通过osalAddTimer定时器向链表里添加了“定时任务”timeout,由osalTimerUpdate来以ms为单位对这些“软定时器”timeout进行减计数,timeout等于0就是溢出时,即调用osal_set_event,实现主循环里对任务的调用。

osal_msg_send:作用是向上级发送消息

//设置消息数据对应是属于哪个任务的
OSAL_MSG_ID( msg_ptr ) = destination_task;

// 将要发送的消息数据链接到以osal_qHead开头的数据链表中
osal_msg_enqueue( &osal_qHead, msg_ptr );

// 通知主循环有任务等待处理
osal_set_event( destination_task, SYS_EVENT_MSG );

举例说明:按键的响应处理过程
Hal_ProcessEvent负责对按键进行持续扫描,发现有按键事件后OnBoard_KeyCallback函数向应用层
GenericApp_ProcessEvent发送一个有按键需要处理的消息,最终由GenericApp_HandleKeys来负责执行具体的操作。

任务调度的完整版:
void osal_start_system( void ) //系统任务开始
{
#if !defined ( ZBIT ) && !defined ( UBIT )
for(; // Forever Loop 死循环
#endif
{
uint8 idx = 0;

osalTimeUpdate();       //更新系统时间

Hal_ProcessPoll();       //轮询定时器和串口

do {
  if (tasksEvents[idx])     //查找最高优先级任务就绪
  {                    
    break;
  }
} while (++idx < tasksCnt);

if (idx < tasksCnt)
{
  uint16 events;
  halIntState_t intState;

  HAL_ENTER_CRITICAL_SECTION(intState);//中断临界状态:保存先前中断状态,然后关中断
  events = tasksEvents[idx];
  tasksEvents[idx] = 0;                // Clear the Events for this task.
  HAL_EXIT_CRITICAL_SECTION(intState); //跳出中断临界状态:恢复先前中断状态

  events = (tasksArr[idx])( idx, events ); //对应的任务函数运行

  HAL_ENTER_CRITICAL_SECTION(intState);
  tasksEvents[idx] |= events;  // Add back unprocessed events to the current task.
  HAL_EXIT_CRITICAL_SECTION(intState);
}

#if defined( POWER_SAVING )
else
{
osal_pwrmgr_powerconserve(); //没有任务运行时,处理器休眠
}
#endif
}
}

2、RTOS系统实现原理

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/911776.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号