打印

ms2程序分析

[复制链接]
楼主: lldwsw
手机看帖
扫描二维码
随时随地手机跟帖
21
jxyhome| | 2007-6-20 10:18 | 只看该作者 回帖奖励 |倒序浏览

继续关注

使用特权

评论回复
22
gyt| | 2007-6-20 10:37 | 只看该作者

谢谢发表!

使用特权

评论回复
23
jxyhome| | 2007-6-20 14:38 | 只看该作者

SI用起来的确很好……

呵呵,对于MCU开发可能感觉不是很强烈,比较大的软件开发就能够感觉到了,呵呵,支持LZ……

使用特权

评论回复
24
古道热肠| | 2007-6-20 15:05 | 只看该作者

顶一下

    用SourceInsight,uEdit等编辑管理源程序都很不错,sourceInsight的调用层次关系是最最有用的功能,结构层次一目了然。

使用特权

评论回复
25
新好男孩| | 2007-6-21 14:56 | 只看该作者

11

在程序中:

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

和用
EA = 0;
........
EA = 1;
这样写有什么不同,有什么好处???

使用特权

评论回复
26
新好男孩| | 2007-6-21 15:25 | 只看该作者

22

提几点意见:
1. 程序中的全局变量太多.
2. #define宏定义太多(带参数的)
这样做程序是简洁了,但不利于初始者.

使用特权

评论回复
27
新好男孩| | 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定义,会让看的人头晕.

使用特权

评论回复
28
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啊.



使用特权

评论回复
29
lldwsw|  楼主 | 2007-6-22 09:19 | 只看该作者

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

从代码上看是没问题的,注意一下ram,rom等,一个一个加上去调试,再不行等下星期本人回公司后,再帮你调试

使用特权

评论回复
30
lldwsw|  楼主 | 2007-6-22 10:29 | 只看该作者

可以的

高四位表示优先级,若一样的就是同一级别了,那就看先后顺序,重要的消息用高一级的优先级,其他没有时间要求的一般都用零级就行了

使用特权

评论回复
31
新好男孩| | 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不要见怪.

使用特权

评论回复
32
lldwsw|  楼主 | 2007-6-22 11:04 | 只看该作者

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

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

data区不能用的太多,因为这个是平台,还需要留一些给具体项目,一个项目做完之后,还需要优化.

使用特权

评论回复
33
新好男孩| | 2007-6-22 11:25 | 只看该作者

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

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

使用特权

评论回复
34
drq1997| | 2007-6-22 19:52 | 只看该作者

使用特权

评论回复
35
wowow| | 2007-6-22 20:24 | 只看该作者

编辑器最强的还是SlickEdit

si做得也不错,只可惜不再更新了.

使用特权

评论回复
36
有梦就去追| | 2007-6-25 14:05 | 只看该作者

to 搂主

((U8 *)(&(u16MsgArray[ u8MsgHead])))[0] = MsgType
是什么意思啊~?

使用特权

评论回复
37
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的编译器是大端编译的,这个请大家注意,也就是高位地址存低位数据,低位地址存高位数据。

使用特权

评论回复
38
hqgboy| | 2007-6-25 16:13 | 只看该作者

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

谢谢啊..

使用特权

评论回复
39
jianghui88| | 2007-7-13 08:09 | 只看该作者

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

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

LZ还得多发表一下你的东西。。。好让我们这些后辈学习学习。。为我们国产电子也作点贡献!

使用特权

评论回复
40
ayb_ice| | 2007-7-13 08:41 | 只看该作者

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则