3048|12

7815

帖子

57

TA的资源

裸片初长成(中级)

楼主
 

只为uC而生,uS成长历程6 (uS v0.1释出!!) [复制链接]

今天是周末,而我刚才一直在看电影。
已经九点了,因为今晚预计的任务比较简单。

对已经完成的定时器中断(及其测试)的实现方式 做个 总结
——因为这决定了以后不断加入新模块 的 模式。

[ 本帖最后由 辛昕 于 2013-8-4 23:57 编辑 ]
此帖出自编程基础论坛

最新回复

我想说能不能让网页别动啊,有个广告一直在显示  详情 回复 发表于 2013-8-5 11:48
点赞 关注
 

回复
举报

7815

帖子

57

TA的资源

裸片初长成(中级)

沙发
 
也许你会觉得我很罗嗦,并且总是踟蹰不前。
因为我光在这个最简单的 定时器中断 和 用 闪烁LED 去验证uSer中的uSTask 的确已经丢到 定时器中断里 执行了。

然而,在今天上午我已经解决初始化顺序的问题以后,我还要啰啰嗦嗦继续这个问题。

这是因为前面说的。
这种通过函数回调的方式 来 实现 uS和 应用 之间通信的机制,它们将成为以后对这个uS框架的继续扩展 起到 奠基作用。

因此,我需要确保它用一种我喜欢,更加简单的方式进行。

因为现在的代码还很简单,非常简单,区区几个源模块。在这个时候尽可能完善,从而避免以后增加到几十模块时去增加,这是非常划算的买卖。

在越上游的地方解决问题和完善机制,其产生的成本代价就越低,这和治理污水要在源头上治理是一个道理。
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

板凳
 
因为当前的项目规模还很小,所以我们得以非常简单清晰地观察当前存在的不足。

首先是uSer库

我们观察到 uSInit()函数被放在uSCore.c里,这是不合适的。
因为uSCore只是uS的一个部件。因此,随着uS的发展,将有归属于uSCore以外范畴的部件,而它们的初始化也应该放在uS_Init()里。

因此,uS_Init()是高于uSCore的一个存在,就如同我们前面实现的uSTaskList()一样。
但是它又不同于uSTaskList(),所以,我们将单独为它建立一个模块。

模块的增删,分离,合并 是 很自然的,我们现在不用太关心它们应该怎么被划分。软件如人生,分分合合,天下大势莫不如此。

同时,这也暗示我们,uS_Init()的接口
uSCore_PosterStruct *uSInit(uSCore_RegistStruct *Str);
也应该做出相应的改变。

应该变成 uS_PosterStruct *uSInit(uS_RegistStruct *Str);

我的意思,我们应该在原来的uSCore_xxStruct 基础上构造它的“超结构体”(模仿 超类的说法而已,实际上C语言里不存在这种说法)。
而原来的uSCore相应结构体变成它的子结构体。

这里,我们稍微有点担心,通过结构体引用函数指针回调已经带来更多的时间开销,如今又增加一级,那岂不是雪上加霜?

不要紧,我们再仔细观察 几个相关函数。
我们发现,最后,我们在初始化的地方,总是通过一个本地全局函数指针承载它,以供调用。

也就是说,我们不在乎初始化的时候到底是两级还是一级,甚至三级四级的结构体成员引用都不要紧。

反正,初始化的时候稍微多花点时间也不是多大的事情。

这次,我们不要急着马上改,因为我还想看看有什么需要调整的部分。
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

4
 
uS库当前非常简单,没什么可看的。
现在我们回到应用函数去看看。

当前的模块组成也很简单。我们只关注和uS相关的部分。
uC部分不管(这是我命名的方式 ,uC意思就是 微处理器,就是与具体芯片有关系的代码,多为寄存器设置和中断调用。uS指的是我为其写的这个框架)
  1. void main(void)
  2. {
  3.     SystemInitial();
  4.     uS_Initializer();
  5.    
  6.     while(1);
  7. }
复制代码
main()函数非常简单,这让我非常欣慰。
很可惜,这是建立在uS_Initializer的基础上的,后者遮掩了它的复杂。
可叹的是,我思考再三,无法把这个函数也封装到uS里。
  1. uSCore_RegistStruct uS_Register;
  2. uSCore_PosterStruct *uS_Poster;

  3. void uS_Initializer(void)
  4. {
  5.      uSCore_Regist_Init(&uS_Register);
  6.      uSCore_Poster_Init(uS_Poster);
  7.      
  8.      uS_Register.TimerInitial = Timer_Initial;
  9.      uS_Register.Led_4_Test = uCGpio_Toggle;
  10.      
  11.      uS_Poster = uSInit(&uS_Register);
  12.      
  13.      // insert uSer to Apper
  14.      set_uSTimerIsr();
  15. }

  16. uSCore_PosterStruct *get_uS_Poster(void)
  17. {
  18.      return uS_Poster;
  19. }
复制代码
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

5
 
我们观察这一部分代码的时候可以发现

有一些部分是没办法回避的。

比如把 初始化定时器中断 的函数。
回忆一下我们最初的初衷,这恰恰是我们这么破费周章要传递到uS内部的函数——我也经常反问自己,我非得这么做吗?我非得这么做吗?

是的,我非得这么做,否则,会闹出笑话:

我的uS里面有开 定时器中断的需要(它有需要放到定时器里执行的任务),然而,开发者用不到定时器,于是他没有打开定时器,于是乎,于是乎,于是乎他就开始纠结,为什么某个uS函数始终得不到结果,但是不知道为什么?
但是他面对的是一个黑盒,于是他只能怀疑uS的正确性。


为了避免类似的事情发生,我们要通过一定的方式确保用户已经开了定时器中断。
而这个费周章的 函数指针 回调 正是基于这种原因 而不断坚持下来的。

然而剩下的一件事情。则不一定了。
这也是从昨晚到今天中午以前让我始终没法完全睡好觉的问题 的 临时性解决方法,而现在它大概找到一个最终的解决方案了。

就是非得通过一个颇显麻烦,不够自动的 set_uSTimerIsr()
(它在此前的名字叫 get_uSTimerIsr()).


这是一个很值得考究的点。
它的实际作用 其实是把 uS内部的 TimerTask带到Apper来,然后让 定时器中断 可以调用它执行它。
本来可以直接通过库调用,而我费了这番周章不过是为了让它自动化一些。

所谓自动化,就是不需要 使用uS库写应用程序的开发者自己写。
但显然,这个 uS_Initializer是需要 应用者 写的。

可以说它变成了一个鸡肋。

然而,稍加思索,我却发现了一个很大的可改进之处。

既然如此,为什么我不在uSInit内部直接调用呢?
为什么我还要传递出一个 uSPoster.

也就是说  你去京东买书,京东明明可以把书放在它随着快件送过来的塑料袋里,为什么它还要把袋子原封不动叠好何书放在一起呢?这是想让你自己拆开快件以后再装进去才拿走呢?
京东怎么想的我不知道,但它的确就是这样干的。
而我一直觉得这个事情很坑爹,所以京东坑爹,我不坑爹。


我意识到,今晚我终于找到一个相当有技术性的改进点了!

[ 本帖最后由 辛昕 于 2013-8-4 22:05 编辑 ]
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

6
 

确定今晚的修改任务,HOHO v0.1版本呼之欲出

1.首先是 uS里,把uSInit变成一个初始化整个uS而非只是uSCore的函数,为此,我们需要扩展当前的uSCore系列结构体;
   另外,这个函数的新归宿是一个应该被命名为uSInitial的模块,显然它和App里的uSInit模块有重名的嫌疑,细究之,是因为这个过去存在的 Apper里的初始化模块的含义不够明确,事实上它做的事情是用Apper里实现的函数向uS注册,因此,它被正式更名为 uS_Regist模块;

2.取消uSPoster(uS邮递员)。因为我们将在uSInit 初始化完毕后.....
不对不对!!
恰好相反,uS里的模块,才应该叫 注册,那个uSInit()函数实际上最应该叫uSRegist(),而这个模块也最应该叫uSRegist.c!!

取消uSPoster,因为我们将在 注册完成以后,直接调用(这个过程也就是把 这个函数指针自动回传到Apper中承载的函数指针里)

不对,我们不是取消了uSPoster,我们只是改变了它的作用。

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

这个地方,让我停顿了很长时间。
它面对的困难在于
1.在uS里直接调用是不实际的。
比如说,TimerTask本来就是我费尽心机要送到Apper里,让开发者把它放到TimerIsr里的。
如果我可以在uS内部 调用我还这么费劲干什么?

所以,最根本的方法就是向Apper传递一个结构体。

而现在我传递出去的实际上是一个 结构体指针,这两者的区别是重大的。
那么,这里要考虑一个问题,结构体是否能被返回?

后补充:这是没有意义的,因为最后还是要开发者在Apper里找合适的地方调用。

中途,我曾经考虑到为什么要这么麻烦呢?
我为什么不把在Apper里要调用东西......但是还是不对,因为我本意是要减轻Apper这边需要开发者自己手动加上去的内容。

再三考虑,我终于意识到这似乎是一个不可能任务。
我有一个函数,不管是 指针 还是 函数(名),它的实现在别处,我可以得到它的地址,然后我要在我自己的代码里调用它,而我却希望我可以不作 调用这个步骤?

这似乎是个不可能任务,不,再想一会!

是的,至少目前我没想到直接的实现方案,也没想到其他方法。
因此,这个问题暂时先押下。

[ 本帖最后由 辛昕 于 2013-8-4 22:36 编辑 ]
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

7
 

每一步都有变化的可能性

你最终看到的6L 的 内容可能是带有各种加粗,蓝色或者红色的 加重字体。
实际上,现在我写7L的内容时,它们却是 全部都一个字体的。

事实上,刚刚我在写6L的时候,我一直发现我还没完全敲定方案。
而从标题你可以看得出,我以为到了可以总结要做的事情列表了。

这就是 极限编程 奇妙的地方。
它时刻存在变化。
不要害怕变化,因为变化才是更真实的状态。

你所要做的就是,努力让你可以应付所有的变化。
此帖出自编程基础论坛
 
 
 

回复

2781

帖子

419

TA的资源

五彩晶圆(中级)

8
 
持续关注中!
此帖出自编程基础论坛
 
个人签名
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

9
 

又一个教训,一定要定期SVN COMMIT

本来我已经改完了。
可是因为一个不小心删除错了两个源文件。

而我刚刚的所有改动过程中我都没有SVN COMMIT,只好重新写了。

这里,推荐大家一定要习惯使用一种 源码版本控制软件
我使用的是SVN,这个东西可以支持网络协同管理。
不过我目前还没有钱买 账号,过后会考虑花钱买一个欧洲账户管理。

暂时使用的是 本地(也就是使用自己的电脑硬盘备份)

假如我已经养成了随时或者至少在特别是删除文件以前就 COMMIT一次,那我现在就不必再花二十来分钟重新做刚刚本来做好的工作、

这还是好的
因为我只是有20分钟没有COMMIT,如果以后是一整天没有COMMIT,那就惨了。

部署使用SVN并不复杂。
而这点时间绝对值得你投资。
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

10
 

v0.1释出

做一些说明

所谓 v0.1 采用最简单的 版本号
第一个数字是大改动的版本,次之自然是小改动。

目前是0,因为 这整个uS框架远未到完成之时。
以后的安排是 当uS整个框架建立完成之日,就是 v1.0释出之日。

而第二个数字1 表示这是迈开的第一步。
因为我们完成了第一个uSCore(框架的内核)的第一个组件 定时器中断。

我个人因为惯常使用 stm8s,所以编译器是iar
然而,我的代码是独立于 MCU和编译器的。

你只需要把其中的代码取出来,就可以随意放到你的ide和mcu上使用。
当然,在uS_App中的部分外设基于寄存器的函数你不得不根据你使用的单片机来做些许改动。
但这只是寄存器设置的部分而已,那是你早已熟悉的内容,除此以外,你无须做任何改动。


[ 本帖最后由 辛昕 于 2013-8-4 23:56 编辑 ]

uS v0.1.rar

56.68 KB, 下载次数: 15

此帖出自编程基础论坛
 
 
 

回复

954

帖子

0

TA的资源

纯净的硅(初级)

11
 
mark....
此帖出自编程基础论坛
 
 
 

回复

954

帖子

0

TA的资源

纯净的硅(初级)

12
 
我想说能不能让网页别动啊,有个广告一直在显示
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

13
 
这个你得问管理员,他们也要吃饭
此帖出自编程基础论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表