OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4531|回复: 8

分享和讨论,UCOSII 内核提高篇

[复制链接]

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2016-8-23 11:35:28 | 显示全部楼层 |阅读模式
        最近在看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;这个我很纳闷。


以上就是我的大概地思路,有很多不明白的地方也有很多理解错误的地方,希望大家不吝赐教。






































自己选择的路,成家前走完。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
 楼主| 发表于 2016-8-23 14:46:18 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2016-3-31
在线时间
26 小时
发表于 2016-9-17 15:56:59 | 显示全部楼层
帮顶一下
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-4-27
在线时间
12 小时
发表于 2016-9-19 10:21:58 | 显示全部楼层
学习了!坚持就是胜利!
回复 支持 反对

使用道具 举报

11

主题

80

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4493
金钱
4493
注册时间
2016-8-2
在线时间
51 小时
发表于 2016-9-19 11:28:26 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

傻牛牛 该用户已被删除
发表于 2016-9-29 19:20:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-11-20
在线时间
22 小时
发表于 2016-10-10 17:00:10 | 显示全部楼层
不错,再配点图的话,就更棒了
回复 支持 反对

使用道具 举报

39

主题

212

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2016-4-21
在线时间
129 小时
发表于 2016-10-15 13:28:17 | 显示全部楼层
帮顶111
回复 支持 反对

使用道具 举报

10

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2016-4-9
在线时间
97 小时
发表于 2017-5-1 18:13:42 | 显示全部楼层
楼主  请问下#define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();},但是这个 OS_CPU_SR_Save()代码是32f4例程里,却没有定义,这个进入临界区对具体硬件是怎么操作的,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 17:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表