9576|53

7815

帖子

56

TA的资源

裸片初长成(中级)

楼主
 

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

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

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

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

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

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

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

最新回复

好,先支持一下!搞单片机久了就想用什么方法更简单,更轻松。 用汇编?用C?用C++?用Micropython? 用操作系统? 还是什么什么的自己的想法。 有想法。就有希望!!!支持!  详情 回复 发表于 2017-9-4 16:55
点赞 关注
 

回复
举报

7815

帖子

56

TA的资源

裸片初长成(中级)

沙发
 

第一步 大致框架

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



[ 本帖最后由 辛昕 于 2013-7-29 20:53 编辑 ]
此帖出自编程基础论坛
 
 
 

回复

1万

帖子

141

TA的资源

版主

板凳
 
关注一下……
此帖出自编程基础论坛
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

4
 

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

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

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

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

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


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

这表明三大基本部件之间也是互不依赖的。
此帖出自编程基础论坛
 
 
 

回复

1149

帖子

3

TA的资源

五彩晶圆(初级)

5
 
关注中。。。。。。
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

6
 

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

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

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

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

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

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

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

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

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

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

极限编程告诉我们,有什么想法,就要马上编程。不要等待~~~
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

7
 

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

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

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函数呢?
此帖出自编程基础论坛
 
 
 

回复

826

帖子

3

TA的资源

五彩晶圆(初级)

8
 
支持!

并且期待
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

9
 

定时器中断的作用

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

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

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()这个函数里就可以了。

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

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

使用 回调函数 的方式,你几乎不受任何限制。
你会选择哪一种呢?
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

10
 

2013.7.29 今晚到此为止

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

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

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

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

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

[ 本帖最后由 辛昕 于 2013-7-29 21:54 编辑 ]
此帖出自编程基础论坛
 
 
 

回复

910

帖子

657

TA的资源

五彩晶圆(初级)

11
 
支持,关注中,表示菜鸟理解不是很明白。
学习
此帖出自编程基础论坛
 
个人签名天下难事,必做于易;天下大事,必做于细。
与其博览群书,不如精读一本。
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

12
 
关注中,就是怕硬件资源捉鸡。
此帖出自编程基础论坛
 
 
 

回复

6423

帖子

17

TA的资源

版主

13
 
关注你的直播哦
此帖出自编程基础论坛
 
 
 

回复

447

帖子

30

TA的资源

五彩晶圆(初级)

14
 

回复 楼主辛昕 的帖子

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

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

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

所以推荐使用脚本语言, 用文本替换其实更简单, 而且可以支持汇编.
此帖出自编程基础论坛
 
个人签名www.ctdisk.com/u/1283024
个人书库,持续更新中。
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

15
 
严重关注。
此帖出自编程基础论坛
 
个人签名我的博客
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

16
 

回复 14楼osoon2008 的帖子

stm8 和51都支持C啊.......
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

17
 

回复 14楼osoon2008 的帖子

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

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

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

能做出来,再说。

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

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

就是说

“这世界少了谁都能活。”
此帖出自编程基础论坛
 
 
 

回复

1100

帖子

3

TA的资源

五彩晶圆(初级)

18
 
走起,跟我想法类似
此帖出自编程基础论坛
 
 
 

回复

5979

帖子

8

TA的资源

版主

19
 
关注
此帖出自编程基础论坛
 
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 

回复

90

帖子

0

TA的资源

一粒金砂(高级)

20
 
此帖出自编程基础论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表