如何快速理解一个全新的嵌入式操作系统

(操作系统抽象层)的编程框架,除了蓝牙相关的底层协议不透明,OS相关的任务调度和通信、蓝牙高层协议都是用户透明的。诚如以上对单任务操作系统的分析,OASL也是一个较弱的操作系统,只包含了调度和通信的内核,和一个硬件抽象层。但不妨碍我们把它当成一个操作系统去理解。

开始,main->osal_init_system-> osalInitTasks,如下图:

在每个任务初始化后,taskID都会加1,而在每个任务初始化的开始都会记录传入的taskID并保存,作为任务的标记。

可以看到,event可能是用户自定义的事件,如这个任务要做的周期性的事情和启动连接的事件。另外,event还可能是系统消息事件(SYS_EVENT_MSG),它是什么?消息和事件在OSAL中是怎么理解的。

其实把事件作为消息的类型更容易理解,事件用一个16位的整型来表示,从代码来看,是每个比特表示一种事件,其最多只能表示16种事件。对于按键消息,由于其可能有多个不同的键值,因此不宜通过多个事件来表示,而是用一个按键事件来表示,然后按键的键值通过消息队列来传递。

通过跟踪消息发送osal_msg_send( uint8 destination_task, uint8 *msg_ptr )和消息接收osal_msg_receive( uint8 task_id )接口,可以发现,,所有的任务共用一个链表型的消息队列,每个结点记录消息的事件类型/值和接收任务的taskID。

那么事件的发送接口呢?如下图

即往tasksEvents的taskID下标成员写入对应的事件值。这样在之后的大循环中目标task就会得到执行的机会。消息发送osal_msg_send不仅将消息插入到全局消息队列链表,而且最后也会调用osal_set_event接口填入SYS_EVENT_MSG事件。

此外,还有一个定时发送事件的接口osal_start_timerEx,其在规定的时间到达后才会发送该事件,以让目标taskID得到执行事件的机会。

四、OSAL消息处理

OSAL提供了一个HAL硬件抽象层,咱们主要分析按键输入和串口输出就好了。

利用TI CC2540进行蓝牙方案开发还是几个前,当时一个小时就理解了OSAL,但现在把当时的理解思路还原整理出来花了差不多四个小时,主要是因为在撰写过程中不断地考虑如何让读者更好地理解本文的学习思路,即总结软件架构方面的知识,和如何从需求的角度去理解新的系统。呜呜,还是把OSAL的消息处理流程留到下一篇好了。

接下来将会陆续推出物联网-微信蓝牙和wifi接入相关的技术分享。敬请关注!

更多原创分享请关注微信公众号:嵌入式企鹅圈!

版权声明:本文为博主原创文章,未经博主允许不得转载。

就是对虚怀若谷谦虚谨慎八个字真正理解的人,

如何快速理解一个全新的嵌入式操作系统

相关文章:

你感兴趣的文章:

标签云: