ms2程序分析

[复制链接]
9302|40
jxyhome 发表于 2007-6-20 10:18 | 显示全部楼层

继续关注

gyt 发表于 2007-6-20 10:37 | 显示全部楼层

谢谢发表!

jxyhome 发表于 2007-6-20 14:38 | 显示全部楼层

SI用起来的确很好……

呵呵,对于MCU开发可能感觉不是很强烈,比较大的软件开发就能够感觉到了,呵呵,支持LZ……
古道热肠 发表于 2007-6-20 15:05 | 显示全部楼层

顶一下

    用SourceInsight,uEdit等编辑管理源程序都很不错,sourceInsight的调用层次关系是最最有用的功能,结构层次一目了然。
新好男孩 发表于 2007-6-21 14:56 | 显示全部楼层

11

在程序中:

bEA = EA;
EA = 0;
........
EA = bEA;

和用
EA = 0;
........
EA = 1;
这样写有什么不同,有什么好处???
新好男孩 发表于 2007-6-21 15:25 | 显示全部楼层

22

提几点意见:
1. 程序中的全局变量太多.
2. #define宏定义太多(带参数的)
这样做程序是简洁了,但不利于初始者.
新好男孩 发表于 2007-6-21 15:43 | 显示全部楼层

33

我提的问题只代表我(我是单片机菜鸟,而且脸皮又厚,不怕楼主骂,~嘿嘿~~).
在MS2中找不到晶体振荡晶的相关信息:
如:
// 晶体振荡器的频率(Hz),例如 (11059200UL)
#define OSC_FREQ (12000000UL)
单片机的引脚连接文件不集中:
见意
 使用端口头文件,你可以将整个项目中所有不
 不同的端口访问特性都放入同一个(头)文件中.
如:

#define DBPort P1
    
sbit LcdRs    = P3^3;
sbit LcdRw    = P3^2;
sbit LcdEn      = P3^1;

sbit HC4040MR    = P3^5;    // 高电平计数器复位,低电平计数器可以计数
sbit Cont_GATE    = P3^6;    // 计数器门闸,高电平外部脉冲可以通过74HC00
过多的用typedef定义,会让看的人头晕.

 楼主| lldwsw 发表于 2007-6-21 16:15 | 显示全部楼层

回 新好男孩

MS2本来没想过发表,在04年的时候就是这个样子了的,当时想到哪儿做到哪儿,所以不是很规范,只是供大家参考,根据您自己的喜好来决定.

上段时间因为MS3的发表,应大家的要求,把MS2发布出来,因为MS2简单明了,所以讲解就基于它来做.

本人的MS1是最简单的,若完全是初学者,可以看MS1,也就是"实用单片机系统",21ic上有,但当时C的功底确实很差,很土,框架差不多.

本人建议多用宏,大家试着用,因为现在的大型软件确实宏定义之类的,确实比较好些,实在不会就退一步.

在程序中:

bEA = EA;
EA = 0;
........
EA = bEA;

和用
EA = 0;
........
EA = 1; 
完全不同,EA原来可能是0,也可能是1啊.



 楼主| lldwsw 发表于 2007-6-22 09:19 | 显示全部楼层

兄弟的程序编的很规范啊,不错

从代码上看是没问题的,注意一下ram,rom等,一个一个加上去调试,再不行等下星期本人回公司后,再帮你调试
 楼主| lldwsw 发表于 2007-6-22 10:29 | 显示全部楼层

可以的

高四位表示优先级,若一样的就是同一级别了,那就看先后顺序,重要的消息用高一级的优先级,其他没有时间要求的一般都用零级就行了
新好男孩 发表于 2007-6-22 10:45 | 显示全部楼层

11

还有一些细巧好像可能更好的做一些优化:
比如:
typedef struct 
{
    word  delay;
    void (*CallBack) ( void);
}MSTimer;
是否改为:
typedef data struct 
{
    word  delay;
    void (code *CallBack) ( void);
}MSTimer;
// 可能的话,存储在DATA区,以供快速存取
// 每个任务的存储器总和是4个字节
这样每个任务就节省了一个字节.
不好意思,我是看到那里就说到那里,希望lldwsw不要见怪.
 楼主| lldwsw 发表于 2007-6-22 11:04 | 显示全部楼层

你说的很对的,水平不错,以你的水平看MS3吧

MS2在04年完成的,没有整理过,你看MS3,完全适合.

data区不能用的太多,因为这个是平台,还需要留一些给具体项目,一个项目做完之后,还需要优化.
新好男孩 发表于 2007-6-22 11:25 | 显示全部楼层

好的,正好MS2也快看完了.现在就试试看看MS3吧!

好的,正好MS2也快看完了.现在就试试看看MS3吧!
drq1997 发表于 2007-6-22 19:52 | 显示全部楼层
wowow 发表于 2007-6-22 20:24 | 显示全部楼层

编辑器最强的还是SlickEdit

si做得也不错,只可惜不再更新了.
有梦就去追 发表于 2007-6-25 14:05 | 显示全部楼层

to 搂主

((U8 *)(&(u16MsgArray[ u8MsgHead])))[0] = MsgType
是什么意思啊~?
 楼主| lldwsw 发表于 2007-6-25 14:42 | 显示全部楼层

这儿饶了好多弯,主要是为了省code的费用

((U8 *)(&(u16MsgArray[ u8MsgHead])))[0] = MsgType

这句话的目的是把消息类型放入到消息队列里面。
因为消息队列是16bit,也就是2个byte,我们把第一个byte当作消息类型,第二个当作消息值来处理。请看下面

分析
u16MsgArray[u8MsgHead] 是一个消息队列的头,是一个16bit的,现在要把他分成两个byte。
第一个,取地址
&(u16MsgArray[ u8MsgHead])
因为是16bit类型的地址,需要强制转换成8bit的类型,所以
((U8 *)(&(u16MsgArray[ u8MsgHead])))
这儿需要说明的是,16bit的数据是2个8bit的数据连续存放的,也就是说U8[0]和U8[1]合成一个16bit的数据
而我们需要把消息类型放到16bit数据的高位,于是就有了
((U8 *)(&(u16MsgArray[ u8MsgHead])))[0] = MsgType


大家可以通过这些代码多学习指针的用法,还有有些数据是怎么存储的

keil51的编译器是大端编译的,这个请大家注意,也就是高位地址存低位数据,低位地址存高位数据。

hqgboy 发表于 2007-6-25 16:13 | 显示全部楼层

怎么都这么牛啊.可惜把票投了...

谢谢啊..
jianghui88 发表于 2007-7-13 08:09 | 显示全部楼层

昨天学了一晚上!很不错的!

昨天晚上大约花了几个小时,看了一下MS2,自己的功低不高。。现在也就是理解一下程序的结构吧!,对他里面对消息的处理也算有了一定的理解。。看来自己以后的程序也得慢慢的向LZ的细路发展了。。还得继续学习!

LZ还得多发表一下你的东西。。。好让我们这些后辈学习学习。。为我们国产电子也作点贡献!
ayb_ice 发表于 2007-7-13 08:41 | 显示全部楼层

这样的小功能KEIL UV3都有...

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

本版积分规则

快速回复 在线客服 返回列表 返回顶部
0