[讨论] 我的想法很简单,我只是想做一个独立于单片机的 硬件管理框架

辛昕   2013-7-29 20:29 楼主
也许你听着听着,会渐渐发现我说的这个东西越听越像一个 单片机实时操作系统——但我只想说,别吓我。
      我没这么大的理想,我只是想做一个简单的程序框架,独立于单片机。

     说起来,这算得上我从玩stm8的时候,不断提到的“一个独立于单片机的通用程序框架” 的一个续集,我希望它会是一个美好的续集。因为似乎经过了一年多两年,我觉得我实现它的力量更加充盈了。

      我暂时给它起一个名字叫 uS。取 u System的意思,本来想叫 uOS,但想想看起来很像山寨的iOS,我觉得没意思,后来想想,这个框架就是要简单,所以名字也应该简单。既然 低端的单片机叫 uC,那我就叫它uS吧。

      到现在为止,我从未使用过任何一种嵌入式操作系统,我不知道它们长什么样,也不知道它们能做什么,做得怎么样。
      
      如果换做以前,也许我会迈不开这一步,认为自己还没学会走就想学飞。然而,最近我改变了这个想法(拜 三叔 的 盗墓笔记少年篇 沙海 影响),我突然想通了很多事情,突然觉得我们都太多地自我设限。

      我打算写一个微框架,因为它是为uC服务的,所以我叫它uS.一个最简单的系统,框架,它面对的也许只是一个只有8pin甚至6pin(比如PIC系列)低端单片机,在一些文献里,它们被称之为uC(我认为老外这个名字起的太棒了。)它也许只是一个智能传感器节点,它像一个荒野观察站里的寂寞值班员,他每天做的事情只不过是观察,记录,回报.......其余的大多数时间里他都在打瞌睡,上头给他提供的也不过是一日三餐,一个栖居之所......
      我们要指望这样一个人必须接受硕士乃至博士的教育么?
      我们经常笑话现实生活里这些可笑的要求,现在,让我们来为我们的uC打造一个属于它的 uS。

      所有这些就是我要做的事情。
      我最终决定在版块里 现场直播,基于两个最重要的理由:
      1.我希望有更多天天在和单片机打交道的人知道我在做什么,我希望他们告诉我他们更多实际的需求,他们希望有什么样的功能,或者什么功能是不值得花费精力的。
      2.我不想做一个孤军奋战的人。关于DIY,关于开源,我最喜欢的一句话就是:如果你不满意,那你就改造它。那你就创造它!
      来,兄弟们!走一个!!

回复评论 (53)

第一步 大致框架

我画了个图,我用的 附件->画图
不要打我.......

uS基本框架图.PNG

[ 本帖最后由 辛昕 于 2013-7-29 20:53 编辑 ]
点赞  2013-7-29 20:46
关注一下……
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞  2013-7-29 20:57

图解1 黑色横线分隔阴阳两界

在上面这幅图里,注意看到我刻意用蓝色 和 红色 来区分上下两部分,并且我还很刺眼地画了一条黑线。

它的含义是,要把上下两部分看成独立的两部分。
彼此是完全没关系的。

也就是说,上面的uS系统,我们可以简称 uSer,下面的是我们针对具体应用具体单片机硬件写的 应用程序,我们可称之为 Apper。

为了减少 uSer 和 Apper 之间 剪不断理还乱 的 奸情(耦合关系)。
我们要画情 楚河汉界——
在代码上表现为“它们彼此之间只严格通过函数接口发生调用,绝对不允许 有任何 外部引用,比如extern 函数 变量。”


甚至,这个思想也应用到 uSer内部。
注意到,我们的 微小内核 uSCore 以及 外围管理 uS-periphal ,以及一些其他 构成的逻辑部件,彼此之间的 逻辑关系 是 OR(没错,就是 逻辑 或)

这表明三大基本部件之间也是互不依赖的。
点赞  2013-7-29 21:01
关注中。。。。。。
点赞  2013-7-29 21:09

第一次“人生抉择”:uSCore需要什么

(话说,以后你们要给我作证,uS这个名字真的是我第一个开始用的哈

uSCore,顾名思义,就是内核。
前面我说了,不要受现有的任何神马神马RTOS,uCos,我还eCos呢......不要受它们影响,做一个完全不一样的东西不会被枪毙呢?

做这个东西,我们的最基本思想就是: 我们需要什么,所以我们构建什么。

现在,让我们来考虑一下,我们写单片机程序时最基本的需要的是什么?

就我而言,在用点亮LED证明我焊接的最小系统正常可用以后,我最先干的一定是 实现一个定时器中断。
为什么呢?

因为有了它,我就可以拥有一个独立于 main主线程以外的一个独立线程,而且还是个很准时的线程,可以认为,它就是一个非常原始,非常原始的时间片机制。

把这么吓唬人的名词忘了,我们拿它可以干很多事。、
比如说你可以用来动态扫描数码管,你可以用来 做不傻乎乎在原地延迟等待消抖的读键函数——以及很多很多其他类似的事情,通过这种异步实现方式,你大大地解放了你的CPU,使你的程序变成了并行程序,提高了系统的响应性能.......

总之,定时器中断,你值得拥有。

然后呢?然后还有什么?
那就交给明天晚上吧。

极限编程告诉我们,有什么想法,就要马上编程。不要等待~~~
点赞  2013-7-29 21:16

第一步实现: 定时器中断,我们要做什么

面对任何一个单片机,对于最基本的 定时器中断,其使用都是两步:

1.初始化一系列 定时器设置和各种中断打开 ,反正都是寄存器的设置;
2.写中断服务函数,我们以后都称之为 Isr(Interrupt Service);

举个例子,以stm8s为例。
  1. void (*Isr)(void) = NULL;

  2. void Timer_Initial(void (*Callback)(void))
  3. {
  4.     TIM2_TimeBaseInit( TIM2_PRESCALER_16 ,400);
  5.     TIM2_PrescalerConfig(TIM2_PRESCALER_16,TIM2_PSCRELOADMODE_IMMEDIATE);
  6.     TIM2_ARRPreloadConfig(ENABLE);
  7.     TIM2_ITConfig(TIM2_IT_UPDATE , ENABLE);
  8.     TIM2_Cmd(ENABLE);
  9.    
  10.     if(Callback != NULL)
  11.        Isr = Callback;
  12.    
  13.     __enable_interrupt();
  14. }

  15. #pragma vector=0xF
  16. __interrupt void TIM2_UPD_OVF_BRK_IRQHandler(void)
  17. {  
  18.    TIM2_ClearITPendingBit(TIM2_IT_UPDATE);
  19.    
  20.    if(Isr != NULL)
  21.       (*Isr)();
  22. }
在位置上,这一部分代码属于 上面框图中,下面红色 右边的 部分。

你会提出一个问题,我为什么没事干要弄一个 Isr的函数指针。
这是一个回调函数,于是你第一反应是,干什么?
难道你要把这个初始化函数放到 其他地方吗?

是的,放到哪里去?

咱们现在是在考虑uSCore,所以理所当然,我是会把它放到 uSer 里,就在uSCore里。

说实话,昨天晚上我写完这一部分以后,早上醒来,我也在想,是啊,我为什么要这样做呢?

定时器中断里放的内容,很可能都是我针对具体应用程序写的应用函数,而这个根据不同单片机不同而写的 定时器函数,肯定也在应用态下。

那我为什么要 让它经由 uSer再回到 main函数呢?
为什么我不直接传递到 main函数呢?
点赞  2013-7-29 21:23
支持!

并且期待
点赞  2013-7-29 21:36

定时器中断的作用

要回答这个问题,我们首先要搞清楚,这个定时器中断所为何用。

我想不到太多,只能想到两个:

1.作为一个粗糙的时间片机制——它就是说,我们要在定时器中断里,放一些函数(或说任务)让它执行;
2.作为一个异步的定时器。

这里对 异步 做一个最简单的解释。

在程序里,当我们需要延迟时,我们是怎么干的呢?
因为指令的执行需要时间,所以计数(计算执行指令的数目),就可以定时。

最简单的方法当然就是
  1. while(delay--);
可是这个方法有N多个理由让你不会大量使用,特别是当延迟时间比较长的时候。
什么叫长(对于一个 1M单周期系统,CPU一个机器周期是1us,那么1ms就是1000个机器周期,这算不算作孽?10ms呢? 100ms呢?简直是罪无可恕。)

所以,我们会采用另一种方法:
在定时器中断里不断累加一个 静态定时器或者全局定时器,然后外部根据这个定时器的数值来判断过了多少时间。

这样做的好处是 定时并不阻塞CPU继续执行其他任务。

---------------------

总结一下,我们可以这样认为,我们要在定时器中断Isr里放的东西无非两种

不断累积(或者递减)的 静态定时器(其实就是变量);
函数;

而这样的 静态定时器,,函数,不仅是在我们的 main函数里有,在uSer里也可能有。
但是前面我们已经严格做了限制:

我们不能让uSer和Apper相互勾搭,狼狈为奸。

所以,我们解决的方案是
通过一个回调函数,让我们在Apper里实现的 定时器初始化,和 TimerIsr可以被uSer调用。

这样,uSer就可以在 Apper还没实现(实际上那个时候,Apper还在娘胎里)的时候,提前调用这个 定时器中断。

------------------------

最后一个问题是

你会质问我,既然你想要uSer可以调用定时器中断,为什么不直接在uSer里实现定时中断机制呢?(就是  定时器初始化 和 编写 定时器Isr函数)

这个更好解释。

因为针对不同的单片机,它们的定时器初始化,所设置的寄存器是不一样的,它们的中断函数格式也是完全不一样的。

而我希望uSer的实现与单片机无关。
所以,我不能在uSer里实现定时器中断机制。

另外就是,即便,我不在乎这点,我在uSer里实现了定时器中断机制。

那么,我的TimerIsr就被藏在uSer里。
我又能怎样让外部的Apper来使用它呢?
放入Apper自己的 函数 和 静态定时器?

在此前不久,对此我也可以实现,我使用的是一种限制同名函数的方式。

以下举个简单例子
  1. /*
  2. 例如
  3. uSer里 实现的 void TimerIsr(void);
  4. */

  5. void TimerIsr_4_Apper(void);

  6. void TimerIsr(void)
  7. {
  8.      // uSer 里使用的;
  9.     TimerIsr_4_Apper();
  10. }

  11. /////==============================

  12. /*
  13.      在Apper里,现在我要把函数或者静态计时器植入 TimerIsr,我只需把它们写在TimerIsr_4_Apper()的函数体里就可以了
  14. */
  15. void TimerIsr_4_Apper(void)
  16. {
  17.       // 你可以为所欲为......
  18. }
上面这个方案也可以实现。
唯一的限制只是名字定死了,当然,这算不得什么很要命的事情。

但是,名字是无所谓。
但是如果我的函数声明不一样呢?我是说带形参?带返回值?

当然,你仍然可以认为无所谓,因为我把它全部包含在 TimerIsr_4_Apper()这个函数里就可以了。

就像结构体封装各类散乱的不一致的数据类型一样。
我一点不关心内部的实现方式。

但相比这种带有限制(就我们现在就已经知道了两个,并且有一个还是实质性的功能性限制)的方案。

使用 回调函数 的方式,你几乎不受任何限制。
你会选择哪一种呢?
点赞  2013-7-29 21:49

2013.7.29 今晚到此为止

如果你有什么问题,请你一定要告诉我,谢谢!

当然,更加欢迎你加入!!

这里说句丑话,其实早该说了。
首先,我从未标榜我做的这个uS是开源的,至少不是完全开源。
假如你要加入,也不意味着你的所有个人努力都要开源。
通过不是很复杂的技术(比如库的封装方法),你可以有足够的选择余地。
因为,我一向相信,能提供切实价值的服务,是可以获取收益的。

同样地,如果有人能为我提供我切实需要并且我认为物有所值的服务,我也愿意支付相应报酬。这句话不仅是在此表明态度,同时也是很严肃地表明,也许有一天我会向你购买你的源码。

当然,如果你慷慨地不惜开源,俺们,,,俺们也特么欢迎

[ 本帖最后由 辛昕 于 2013-7-29 21:54 编辑 ]
点赞  2013-7-29 21:52
支持,关注中,表示菜鸟理解不是很明白。
学习
天下难事,必做于易;天下大事,必做于细。 与其博览群书,不如精读一本。
点赞  2013-7-29 22:10
关注中,就是怕硬件资源捉鸡。
点赞  2013-7-29 23:34
关注你的直播哦
点赞  2013-7-30 08:38

回复 楼主辛昕 的帖子

老实说我没完全明白你的意思, 不做操作系统, 只想做一个应用平台, 这两者之间有区别吗?

不可否认ucos这个号称最简单的内核, 也不可能在8bit或是4bit mcu运行的,

但问题这些8bit或4bit mcu一般不支持C, 也不可能支持C

所以推荐使用脚本语言, 用文本替换其实更简单, 而且可以支持汇编.
www.ctdisk.com/u/1283024 个人书库,持续更新中。
点赞  2013-7-30 08:56
严重关注。
我的博客
点赞  2013-7-30 09:37

回复 14楼osoon2008 的帖子

stm8 和51都支持C啊.......
点赞  2013-7-30 10:25

回复 14楼osoon2008 的帖子

操作系统的内涵过于丰富,考虑的事情过于多
所谓贪心不足蛇吞象。
最终只能做出一个一点都不u的东东来

也许有一天这玩意会变成一个操作系统

但至少我现在没这个想法。
只是一个框架而已。

能做出来,再说。

其实我自己也想过
如果最终真的变成一个操作系统那也是不要紧的,因为在我的设计初衷里,任何部件都是 OR 关系,我管他什么操作系统,我管他什么 硬件管理

最终都只是一个 加关系 的 逻辑部件。

就是说

“这世界少了谁都能活。”
点赞  2013-7-30 10:28
走起,跟我想法类似
点赞  2013-7-30 10:37
关注
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
点赞  2013-7-30 10:39
点赞  2013-7-30 11:33
123下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复