提示:您的电脑还没有安装阿里旺旺。
免费安装阿里旺旺,与百万商人在线谈生意!
关闭
阿里巴巴首页
添加到收藏夹
客服中心
阿里助手
在线洽谈
点击推广
出口贸易
国内贸易
所有行业
商人博客
生意经
直播
商圈
博客
论坛
资讯
博客文章
免费开通
登录
评论管理
博客管理
发表文章
好友播报
我的博客首页
我走我路
http://shjefu.blog.china.alibaba.com/
>>
收藏本页
|
设为主页
您现在的位置:
阿里巴巴博客
>
我走我路
帮助
RSS订阅
档案
好友
全部文章
我走我路的首页
我的推荐
无推荐
我的图片
(共1张)
>>更多
我的文章
>>更多
学习编写简单的嵌入系统
(2008/07/30 10:04)
标签:
产品
在嵌入式的芯片中使用操作系统,是因为有了操作系统,就可以有多条线程几乎同时的工作,我们能够更加方便的实现我们的设计。我打个比方,如果你要用单片机检测某个电阻两端的电压,依据该电压值调节产生的PWM信号,然后还要把它输出到LCD,这些任务几乎都是同时的,那你会怎样做呢?我们的c语言可是单任务执行的,你用一个while循环去检测电压的话,如何合理的再去调节PWM信号和输出信息?或者一个函数里面要延时等待一个信号才能作出下一步的动作,但这个信号却要在另外一段代码中检测并传送给该函数,如何处理?如果有了操作系统,这些头痛的事情就变得非常简单。我们可以把时间轴分成很多很小很小的时间片,比如每个时间片100us,上面所说的三个任务分别叫任务1,任务2和任务3。我们让任务1占用10个时间片先执行,然后让任务1休眠,保护好现场,记录程序的入口地址,接着转到任务2也执行10个时间片,再让任务2休眠,保护现场记录入口地址,转而到任务3,任务三执行10个时间片后,依旧让任务3休眠,保护现场记录入口地址,接着转到任务1的入口地址,恢复任务1的现场,执行任务1……。很明显,比起没有操作系统的单线程,使用操作系统可以使我们的设计任务变得非常简单。
师兄的操作系统基本上是按一般书本上的描述来实现的,但在这里我并不是想介绍该操作系统,因为真介绍起来就脱离不了书本的框架,却不如书本详细。我只是想在阅读了源代码后谈一些自己的看法。我认为如果你想要自己在一块芯片上实现一个操作系统,了解以下的几个方面问题对你也许会有帮助。
一,操作系统的算法结构,也就是线程(进程)的调度策略。
对于了解windows系统的高手来说,线程和进程绝对是有严格区别的,但在这里我并不详细区分线程和进程,我指的线程或进程只是对应一个任务,一个任务一个线程(进程),就这么简单。
基于多线程的结构,实质是将时间分片,每个线程占用一定的时间片执行任务。一般来说,操作系统对线程获得时间资源使用权的调度策略有两种模式:循环链表结构和优先级结构,线程间的关系可以是像一个循环链表结构的队列或是拥有优先级的队列。
如果线程间是循环链表结构的,那是最简单的了,每个线程交出时间使用权的时候,下一个接受时间使用权的线程是默认的,我们按线程启用的顺序标号就行了。我们可以用一个环状结构来表示。但若是有优先级关系的,那么就不同了,高优先级的线程随时都可以中断低优先级的线程,并且同一个优先级可以有不止一个线程,同一个优先级的线程按先来后到排队,高优先级线程显然拥有插队的特权。
一般来说,在嵌入式操作系统中传统意义上程序的入口main()函数被隐含,因为main()只是一个函数而非线程,我们可以在main()中创建一个主线程IntMain()并自动切换到IntMain()去执行,其余的函数都是可以在线程中自由调用的。
线程的调度策略,是编写操作系统的人定义的,实时操作系统和非实时操作系统最大的区别就是调度策略的不同。前面所提到的使用时间片的方式,一般是通用操作系统所采用的,对于实时的操作系统的调度策略,很多书上都会介绍静态表驱动方式和固定优先级抢先式调度方式(想要详细的了解最好找本专业的书看看),在这里我就不多说了,如果只是学习自己编写,我们就使用最简单的结构关系就可以了,以后有想法,可以再去更改。
二,如果你能够熟练地操作内存,那么可以说你已经不在门外了!这个是我看过代码后最大的感悟。
在一块单片机里面,所谓的内存就是指RAM空间,而ROM空间就相当于硬盘,是存放代码的。当然,在RAM的前面好一段空间范围是一些特殊寄存器和特殊存储区,这些就是我们要保护的现场,其余部分我们可以当作堆栈来使用, 因此,尽量在定义堆栈的开始地址时避免与这些特殊区重叠。程序下载到芯片后就是放置于ROM空间,所以操作系统本身不能占用太多的ROM空间,也应尽量少定义全局变量,以免占用过多的堆栈空间以致于任务无足够的空间存储变量。
我在这里所说的熟练地操作内存,指的是你要非常了解堆栈的结构并能够熟练的操作指针对其进行访问。我们用malloc()函数动态申请一段内存空间,用于保护将要休眠的线程的现场,同时要能够准确的把将要苏醒的线程的现场恢复。要做到这些,你必须能够游刃有余地操作指针。
虽然现在的高级语言越来越偏向于摒弃指针,但我认为一个优秀的程序员一定要对指针有深入的了解。坦白说我最怕的就是指针,所以我只是一个菜鸟程序员,然而菜鸟程序员的经验有时却是经典的反面教材。
三,你必须保存将要休眠的线程的断点地址,以及准确的回到将要苏醒的线程的入口地址(也就是该线程上一次的断点地址)。
这是毫无疑问的,任一个地址的错误都将导致线程无法正常返回,其结果就是系统的崩溃。也许有些朋友会说:话说的是倒是非常简单,问题是如何做到?这要求我们知道在数字芯片里不同段的代码间是如何切换的。
如果我们在函数f1里面调用了函数f2,当函数f2执行完后,执行程序的指针(在单片机里就是cp)会自动跳转回到f1去执行f1中未完的代码,这些都是不用我们考虑的,我们的编译器已经帮我们搞定了一切,但如果你要自己编写操作系统的话,你就必须知道切换的机制。呵呵,这还不简单,当我要退出一个线程时把当前的cp值保存起来,再把将要进入的线程的入口地址值写进cp不就ok了吗?这样想没有错,但是关键是寄存器cp是不能直接读取和赋值的,该怎么办呢?了解整个单片机架构的朋友一定知道了如何去获取cp的值和如何把一个值写入cp,我们要通过一个桥梁,这个桥梁就是sp——堆栈指针sp。
再回过头来看刚才举的例子函数f1和f2。当f1要调用f2时,将cp的值(断点地址)压入堆栈,同时将f2的入口指针(就是函数名f2)的值也压入堆栈,再将它pop到cp,cp就转到f2的入口去执行了,执行完毕再把f1的断点地址pop到cp(并不用保存f2的断点,因为不会再回来),这样cp又回到了f1继续执行未完代码。现在,我们把函数替换成线程,与函数调用不同的是我们的线程基本上是未执行完毕就要切换到另一个线程的入口地址,等会还要再切换回来,因此就要求我们自己将断点地址压栈存储,并将入口地址写入sp所指向的内容并pop到cp。
因此花点时间详细地去了解cp和sp是非常有益的,看看地址值是如何在它们之间切换的。
四,时间片的使用和定时。
时间片的概念是与操作系统相关的,这也是一个困扰很多初学者的问题之一。我都忘了当时刚刚看书的时候自己对时间片概念的了解有多少,感觉就是三个字:不明白,即使是现在,了解也不多。其实,如果是研究PC操作系统,时间片是非常重要的,每个线程在获得时间使用权的时候都是有一定时间限制的,这一时间的限制就是内核给线程分配的时间片的多少。前面我打了个比方,把每个时间片长设为100us(实际上这个值太小了,如果时间片长太小,那么操作系统频繁地处理中断已经严重的影响了系统的运行),操作系统为每个线程都安排一定的运行时间(比如是几个时间片长),时间一到就切换到其他线程去执行,如果线程在给定的运行时间内完成则可以提前切换。规定一个时间片的大小必须要有一个定时器,这个定时器就是专门用来产生时间片的不得用于其他用途。
但是,我认为在嵌入的操作系统中,如果不是对时间要求很严格的话,可以弱化对时间片的使用,打个比方,线程在获得时间使用权后,何时交出去也可以由该线程本身决定,这样的设计就要求线程之间的关系比较“友好”,你要保证每个线程不能出现死锁,否则其他的线程就会饿死。这样的设计可以使内核比较简单,但是却要求使用操作系统的用户要对该操作系统有全面的了解,因为何时决定线程切换是用户自己调用切换线程的代码实现的而不是内核,这要求用户对各个线程间的逻辑关系非常清晰。这样的话时间片的使用就局限在延时上了,打个比方,某一个线程在执行到一定时候得延时5s后再执行余下的代码,这个5s的要求可能是比较精准的,在这5s的时间里我们不可能浪费时间资源,所以在这段时间我们就切换到其他线程去运行,时间一到再切换回来。因为可能有好几个线程都会调用延时,所以时间片就重要了,如果没有时间片的概念那么两个定时器无法执行三个以上的延时任务。
五,如果以上这些你都已了解的话,那么再来谈谈一些比较细节的问题。1,假如采用一个简单的内核,由用户决定线程何时切换,那么该在何处进行线程之间的切换?我们可以把切换线程的代码写在一个函数Switch_fiber(int)里面,用一个死循环去执行一个任务,在每个死循环的开头或者结尾,调用Switch_fiber(int),Switch_fiber(int)的参数可以是切换到的线程的ID,或者是进行默认切换。2,一个线程完成任务以后就成为空线程,尽量在其他的线程中删除该线程,因为其他线程在切换到空线程时也会花费时间。3,很多书上开始介绍操作系统时都会提到事件驱动的概念,这个“事件”也是比较烦人的,我当时看的晕乎乎的,不过这是我个人见识太少的问题。现在想来这个“事件”是很有帮助的,事件是一个比较抽象的概念,我们可以把系统中等待执行的不同的操作抽象为事件,就像一个FIFO队列,有“事件”发生,我们把这个事件插到队尾排队等待处理,在队列头部通过获取事件的句柄完成对事件的操作,例如很多人去银行,有些人是存钱的有些人是取钱的,对于服务员来说每个用户就可以是一个事件。但是我认为我们实际编写简单的操作系统的话,不一定要借助事件的概念,只要你明白自己怎样去各个线程的关系,如何对线程进行处理的话,不借助事件也是可以的。
以上这些是我个人的一点看法,有很多纰漏之处,希望对初学者有帮助。
by hhj
浏览全文(0)
|
发表评论
|
阅读评论(1)
如何增加你的财富值
(2008/01/29 11:28)
标签:
摘要:
在阿里帮帮回帖可以更快的提高你的财富值。尤其财富值越多的帖子,楼主看你的回帖有道理,一般都会送你财富值的。就这样我每天都有几十点的财富值进帐。 还有一些回帖就奖励的帖子,在论坛的主页上。你找到这样的帖子,只要你回复,楼主就会送你财富值。 网站的活动你参加了,完成了活动,网站版主就会送你财富值,很诱人的。 如果你的文采很好,悟性很高,你就发表自己的想法,好的帖子可以获得比较多的财富...
浏览全文(2)
|
发表评论
|
阅读评论(1)
公司的明天
(2008/01/25 11:04)
标签:
营销
摘要:
公司目前的业务是汽车电子产品改装车方面的,有无线绞盘控制器及相应的接触器 这是公司目前量最大的.电子涡轮控制器,车身高度控制器.无线控制方面的产品是 遥控器,主机控制器.还有最近开发的多媒体升降机控制系统. 公司的客户主要是国外的客户,销售量几乎占公司的全部.国内的客户是一些外贸公司 其产品主要是汽车改装部分的产品.之前开发的客户,或因后续服务没有跟上,而流失掉. 国内的...
浏览全文(0)
|
发表评论
|
阅读评论(1)
HID伸缩灯控制器
(2008/01/17 16:09)
标签:
产品
摘要:
产品功能: 使用线圈伸缩机构控制hid灯的远光近光的实现 产品电气参数: 电源:+12v 控制两个线圈伸缩机构,正反通电 控制两个hid安定器 产品设计: 硬件部分: 使用两个继电器控制hid安定器 使用两个继电器控制线圈的正反通电 远近光的状态侦测 电源的干扰处理
浏览全文(9)
|
发表评论
|
阅读评论(0)
爱情是什么
(2008/01/14 11:28)
标签:
情感
摘要:
今天在qq上看到朋友的签名是"爱情是什么"。然后问自己爱情是什么呢? 在新浪网上看到分别60年的俄罗斯夫妻,奇迹般的在同一个村庄重逢了。后来重新步入了婚姻的殿堂,相约一起走完余下的人生。我想这就是爱情吧。 我觉得,爱情就是牵手。在平凡的日子里,携手相走过人生路上的喜怒哀乐。 在没有爱情的时候,你我还是两个个体,彼此走在不同的路上。当爱情出现的时候,你我是...
浏览全文(0)
|
发表评论
|
阅读评论(0)
多媒体平台升降机设计
(2007/12/27 10:55)
标签:
产品
摘要:
产品功能: 产品实现的功能是将多媒体设备比如电视机,电脑,或者其他的多媒体设备放在这个产品上,使用遥控器控制多媒体设备的上升,下降。 产品设计要求: 电源要求:AC 110V 2A 遥控距离: 20米,遥控器可以设定拨码状态 速度要求:要求在50公斤范围内速度要求一...
浏览全文(2)
|
发表评论
|
阅读评论(0)
不做一个浮躁的嵌入式工程师
(2007/12/17 15:11)
标签:
情感
摘要:
从某个网站上看到这篇文章,挺好的,与大家一起共勉. 1. 不要看到别人的回复,第一句话就说:给个代码吧!你应该想想为什么。当你自己想出来再参考别人的提示,你就知道自己和别人思路的差异。 2. 初学者请不要看太多的书那会误人子弟的。先找一本好书系统的学习。很多人用了很久都是只对部分功能熟悉而已,不系统还是不够的。...
浏览全文(0)
|
发表评论
|
阅读评论(0)
2007年总结
(2007/11/20 15:23)
标签:
情感
摘要:
2007年马上就要过去了,是要好好检讨一下。看看今年究竟做了哪些事情?是得还是失。
浏览全文(23)
|
发表评论
|
阅读评论(0)
首页
<上一页
1
下一页>
末页
博主信息
(点此看大图)
shjefu
路,在我脚下. 走过的路,认识到很多, 还有很多没有认识到. 前方的路,不知是怎样, 是否直通罗马, 还是弯弯曲曲. 始终坚信: 路,在我脚下
访问量:568
文章数:8
评论数:3
RSS订阅
订阅博主的博客:
不知道如何订阅?
个人资料
·性别
·职位
·地区
·主营产品
更多内容
最新博文
·
学习编写简单的嵌入系统
·
如何增加你的财富值
·
公司的明天
·
HID伸缩灯控制器
·
爱情是什么
·
多媒体平台升降机设计
·
不做一个浮躁的嵌入式工程师
·
2007年总结
最新评论
·
slsy7950999
:
您的博客太好了,我很感兴趣…
·
yihanjunnan
:
今天上七,钧昊俊男给你拜年…
最近访客
博客推广专家
博客E时代
酷乐福
说你呢过来点我
说你呢过来点我
鞋业管理顾问
白头佬黄工
博客E时代
我的文章分类
·
我的所有文章
·
嵌入系统
·
工作感悟
·
设计资料
·
产品设计
·
网商感悟
·
公司动态
[标签]
营销
产品
情感
日历
<<
2009年07月
>>
日
六
一
五
二
四
三
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
好友列表
博客宝贝
最近更新博客
·
万高电气
·
国际电子批发部
·
思高电子诚信天下
·
散淡人生
友情链接
暂无友情链接
编辑推荐
最小掌柜:92年清纯小妹创业经
阿里《博周刊》第二十一期
·
今日头条:我来揭电视购物暴利黑幕
·
大学生立生死状,6月拿下100万
·
一句猜猜我是谁,被骗3000元
·
这样开店,想不火都很难!
·
想做好生意,先学人生六毒
·
创业正顺,母亲要我考公务员
·
说我没良心?是你的心太黑了
·
供应商,我说话你别插嘴行吗?
·
我送骗子6800元骗子气吐血
·
网络代理
免费加盟
开家小本服装店
·
小本开店
学生创业
先试用后加盟
·
自测:你是当老板的料吗
免费订阅
·
小额批发免费推广
厂家货源
·
网店进货首选
精品服饰专区
·
胡戈新作 鞋袭-总统的反击
·
巴菲特财富人生精华版
·
职场宝典马云创业经历
·
李宁品牌管理之道
·
名人谈创业:杨澜
·
乳业教父伊利前老板郑俊怀创业史
·
新时期感悟李嘉诚创业时期管理心得
·
名人创业故事:当年如何挖第一桶金
·
唐骏:创业不需要激情
·
李嘉诚:想成功先花90%时间想失败
·
奶业大炮离任奶协曾屡曝特仑苏内幕
·
不开店,三天从淘宝赚上万
创建信息
阿里创建号:ALI-001783974
创建日期:
2007-11-20 12:48:29
修改日期:
2008-07-30 10:04:26
版权所有,未经作者许可,不得抄袭或转载,如有需要,可以与
本人
联系。