高级会员
- 积分
- 964
- 金钱
- 964
- 注册时间
- 2014-11-18
- 在线时间
- 160 小时
|
最近在看ucosii内核,里面的巧妙地利用了数据结构让我如痴如醉。单片机如果不涉及操作系统,或许永远也欣赏不了这些C语言的魅力。
其实简单的想想就知道,为什么硬件一样,但是加了ucosii的内核,所有的一切都变了,应用变得非常简单,这些其实并没有改变什么硬件
只是加了几个ucosii的c文件,说明软件就算不是万能的也算是千能的。
看内核必不可少的条件是数据结构,说白了就是链表。我大概给大家复习一下链表。链表其实是结构体拼起来的,而他们的链接的媒介就是指针。
假如有一个结构体 struct A a1;这个struct A的成员是各种数据,其中有一个成员是 struct A* next;next指向 下一个结构体,以此类推。
这么一来 我们只有给出链表的头,就能把整个链表的数据全部找到。 如果把这个条链表看作火车,那么你可以在我的任意一节车厢装东西(数据)
而我只要知道头可以通过数车厢知道你在第几节。比如毒品在第七节车厢,然后从头开始循环7下就到了第七节车厢了,然后把里面的内容取出来就好了。
具体的数据结构的知识自己去看。
下面开始ucosii内核。其实吧原子哥都没分享这类帖子,估计是有什么难言之隐,而我初生牛犊不怕虎,没考虑那么多的后果。
ucosii内核,先了解一下几个概念。任务控制块(这个就是结构体,可以理解成火车的车厢)。他的成员有哪些,自己看。
还有事件控制块、消息队列的数据结构这些。先说说任务这个,他是怎么搭建起来的,在系统初始化的时候,系统会先建一个
任务控制块的空链表,也就是里面的成员都是0,或者NULL。这个时候你创建了第一个任务,那么把第一个任务的数据初始化
到这个任务控制块中,也就是说哪些变量该初始化的初始化,该赋指针的赋指针。第一个任务控制块包涵了第一个任务的信息
把这个任务控制块的地址赋个空链表的struct A*next;那么第一个任务的控制块就上车了,而且是在车头第二节车厢。(第一个被空闲任务占掉了)当你创建
第二个函数的时候,也会把信息装的一个临时的任务控制块中,然后把这个地址给第一个任务控制块的struct A*next。当你创建
后面的任务的时候都是这样,这样就把这些任务控制块做成了一个表。
那么我们大费周章的做了这么一个链表,到底想干嘛呢,其实啊他能干很多事情,链表最好用的就是遍历。链表其实在物理地址
上面是不链接的,但是在指针转向上面是链接的,就像字符串一样,可以做指针偏移,一个一个遍历一遍。举个简单的例子,
当你把链表搭建好了以后,你可以遍历一下各个节点状态,是就绪的还是挂起的阻塞的,然后还可以遍历一下优先级这些,
然后你就可以做判断,来进行任务切换了。 (我的一个疑问,链表的遍历我没找到,难道是系统藏起来了,用的汇编写的?而且链表必须实时的刷新,那应该放在一个任务的while(1)里面,这样才能知道任务的切换)
在后面是事件的控制块了,事件控制块的链表也是差不多的意思,但是我没有看到事件控制块的节点指针,也就是struct A*next;这个我很纳闷。
以上就是我的大概地思路,有很多不明白的地方也有很多理解错误的地方,希望大家不吝赐教。
|
|