|
楼主 |
发表于 2014-2-11 11:01:03
|
显示全部楼层
本帖最后由 smset 于 2014-2-11 14:47 编辑
小小调度器至2012年发布以来,受到了一些坛友们的关注和支持,在此表示感谢!!!
新的一年来了,总要做点新的事情。 在小小调度器这一块,要做些什么呢?
我有一个想法: 将小小调度器和面向对象设计思想结合起来,形成一个新的单片机编程框架。
小小调度器虽然是针对极小资源单片机设计的,但事实上并不是真的只能用于很简单的小产品上,
举例来说,我公司的产品功能实际是比较复杂的,一个CPU要实现完整的tcpip协议栈+基于SD卡的文件系统+mp3解码播放+也有液晶和按键+图形化人机界面+串口+Modbus等等。
也一样采用了小小调度器的任务调度框架,小小调度器也能从容应对这类项目,任务调度的稳定性表现优异,这块一直让我们很放心。
而另一方面,复杂系统的软件代码,客观地说,最好是能结合面向对象OOPC的思想,这几十年面向对象的编程方法在软件领域全面开花不是没有道理的。
哪怕是嵌入式单片机软件代码,只要复杂到一定程度,就可以考虑采用面向对象的编程思想。随着单片机处理能力的普遍增强,我觉得总体来说,以后单片机编程的思想迟早会涉及到面向对象的。
因此我计划基于小小调度器,打造一个基于任务对象的调度系统。
进而,再升华成一种面向任务的嵌入式系统编程方法,这会更加针对嵌入式系统软件开发,,这也算是我自身的一个提升吧。
我认为各种编程方法以及设计模式等等,一个是各有其最佳的应用领域,另一个方面就是都是为了降低开发人员的思考和理解难度。
我觉得针对单片机的开发,面向任务应该是一个比较容易理解的方法,
实际上,我们已经非常习惯于将单片机软件的各个处理部分称为“任务”,比如键盘任务,液晶显示任务,串口任务 ,。。。等等。 而不是称之为键盘状态函数,液晶显示状态函数,串口状态函数。。。。。。
这说明, 我们在直观上已经把任务理解为一个单片机软件系统的基本功能单元,“任务”,Task, 它所蕴含的东西比数据更动态,比状态更完整,也确实更加能精准地表达我们想要的处理过程。
这里举个实例,结合oopc的思想,将小小调度器的任务抽象为一个Task类,然后键盘或串口任务都基于是继承Task类的子类,以上代码在CBuilder验证过:
先贴出Demo代码,结合了lw_oopc:
- #ifndef TASK_H_INCLUDED_
- #define TASK_H_INCLUDED_
- #include "lw_oopc.h"
- #include "xxddq.h"
- ABS_CLASS(Task)
- {
- unsigned char _lc;
- unsigned char _timer;
- unsigned char _index;
-
- void (*init)(Task* t,unsigned char index); // 初始化
- unsigned char (*execute)(Task* t);
- };
- CLASS(KeyTask)
- {
- EXTENDS(Task); // 继承Task抽象类
- void (*init)(KeyTask* t,unsigned char index); // 初始化
- unsigned char (*execute)(KeyTask* t,unsigned char _index);
- };
- CLASS(UartTask)
- {
- EXTENDS(Task); // 继承Task抽象类
- unsigned char uartid;
- void (*setuart)(UartTask* t,unsigned char uartindex); // 初始化
- void (*init)(UartTask* t,unsigned char index); // 初始化
- unsigned char (*execute)(UartTask* t,unsigned char _index);
- };
- #endif
- #include "stdio.h"
- #include "string.h"
- #include "task.h"
- /* 初始化任务 */
- void Task_init(Task* t,unsigned char index)
- {
- t->_index=index;
- t->_lc=0;
- t->_timer=0;
- }
- /* 任务执行 */
- unsigned char Task_execute(Task* t)
- {
- }
- ABS_CTOR(Task)
- FUNCTION_SETTING(init, Task_init);
- FUNCTION_SETTING(execute, Task_execute);
- END_ABS_CTOR
- /* 键盘任务 */
- void KeyTask_init(KeyTask* t,unsigned char index)
- {
- t->Task.init(t,index);
- }
- unsigned char KeyTask_execute(KeyTask* t)
- {
- _SS
- while(1){
- printf("I am KeyTask!\n");
- WaitX(100);
- }
- _EE
- }
- CTOR(KeyTask)
- SUPER_CTOR(Task);
- FUNCTION_SETTING(init, KeyTask_init);
- FUNCTION_SETTING(Task.execute, KeyTask_execute);
- END_CTOR
- /* Uart任务 */
- void UartTask_init(UartTask* t,unsigned char index)
- {
- t->Task.init(t,index);
- }
- void UartTask_setuart(UartTask* t,unsigned char uartindex)
- {
- t->uartid=uartindex;
- }
- unsigned char UartTask_execute(UartTask* t)
- {
- _SS
- while(1){
- printf("I am UartTask %d!\n",t->uartid);
- WaitX(200);
- }
- _EE
- }
- CTOR(UartTask)
- SUPER_CTOR(Task);
- FUNCTION_SETTING(init, UartTask_init);
- FUNCTION_SETTING(setuart, UartTask_setuart);
- FUNCTION_SETTING(Task.execute, UartTask_execute);
- END_CTOR
复制代码
|
|