打印

关于MS3程序问题!

[复制链接]
3062|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
新好男孩|  楼主 | 2007-6-22 15:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
high| | 2007-6-22 17:15 | 只看该作者

re

我觉得应该是等于
typedef Function (void (*)(void));

void (*Function)(void);相当于(void (*)(void)) Function;

----

((U8 *)(&x))[0]   
x强制转换成unsigned char*后,取出a[0]值或者a[1]值。
我估计a是一个unsigned short的值,这个值的前8个位表示消息类型,后8个位表示消息内容。
如果是这样的作用,可以改成这样:

#define MSG_TYPE(x) ((U8)(x>>8))
#define MSG_VALUE(x) ((U8)x)

使用特权

评论回复
板凳
新好男孩|  楼主 | 2007-6-22 19:38 | 只看该作者

?????????

我想关键是这两条语句:
//first put in data, then increase u8MsgHead
((U8 *)(&(u16MsgArray[ u8MsgHead])))[0] = MsgType;    
((U8 *)(&(u16MsgArray[ u8MsgHead])))[1] = Val;

使用特权

评论回复
地板
新好男孩|  楼主 | 2007-6-23 10:27 | 只看该作者

请lldwsw帮忙解答.

在MS3的main()函数中定义了一个U16 Msg;
那么它的高位数据就是(即消息类型):
((U8 *)(&(u16MsgArray[ u8MsgHead])))[0]
低位的内容就是消息的指针
((U8 *)(&(u16MsgArray[ u8MsgHead])))[1]
是不是相当于:
Msg = u16MsgArray[ u8MsgHead];
能详细的讲解一下吗??? 

使用特权

评论回复
5
lldwsw| | 2007-6-25 14:57 | 只看该作者

回 新好男孩

Msg = u16MsgArray[ u8MsgHead];

是这样的。

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

#define MSG_TYPE(x) ((U8)(x>>8))
#define MSG_VALUE(x) ((U8)x)
对比功能类似,但为了节省代码,提高速度,直接对内存操作。

typedef void (*Function)(void);
是否等同于:
typedef Function (void (*Function)(void));

这个我还真的很难说,我上面这句也是请教别人的,因为有一个朋友这么用过,当时我这个MS3委托她在修改,她给我加了这个,她说华为那边都是这么做的,应用比较广泛,我看了确实很舒服,就用上了,她的说法这是一个类型定义,请按这个用即可。


#define MSG_TYPE(u16) ((U8 *)(&u16))[0]
#define MSG_VALUE(u16) ((U8 *)(&u16))[1]

这个是一个宏,我比较喜欢用,在大型程序中这种用法非常广泛,可以提高程序可读性
这个意思就是取u16的高8位,或者是低8位。


到了MS3,是不是觉得看起来有些累啊,指针确实太灵活了,但用好了却很神通。

使用特权

评论回复
6
新好男孩|  楼主 | 2007-6-25 16:03 | 只看该作者

是有些累,不过进步很大!谢谢

typedef void (*Function)(void);
typedef struct 
{
    U16  delay;
    Function pCallBack;
}MSTIMER_T;

typedef enum {
    MSTIMERMODE_HANDLE_IN_INT = 0,
    MSTIMERMODE_HANDLE_IN_MSG = 1
};
typedef U1 MSTimerHandelMode;
上面MS3的原形数据
做以下修改是否合适??
//////////////////////////////////
typedef void (code *Function)(void);
typedef struct 
{
    U16  delay;
    Function pCallBack;
}MSTIMER_T;
typedef enum {
    MSTIMERMODE_HANDLE_IN_INT = 0,
    MSTIMERMODE_HANDLE_IN_MSG = 1
}MSTimerHandelMode;
//////////////////////////////////
因为修改前:
Program Size: data=71.4 xdata=0 code=2592
而修改后:
Program Size: data=62.3 xdata=0 code=2543
最后还是有一点不是很明白的就是这个宏:
#define FUNC(u16Val)    (*(Function)u16Val)()

谢谢

使用特权

评论回复
7
lldwsw| | 2007-6-25 16:20 | 只看该作者

#define FUNC(u16Val)    (*(Function)u16Val)()

这个是把u16Val一个16bit的数当作一个函数来处理,所以要用Function强制类型转换成函数指针,之后,运行这个函数。


前面说的那个,你加了一个code,代码确实省了很多,那个
typedef enum {
    MSTIMERMODE_HANDLE_IN_INT = 0,
    MSTIMERMODE_HANDLE_IN_MSG = 1
};
typedef U1 MSTimerHandelMode;

是学一个朋友的,因为枚举是16bit类型,而我这样做是bool类型,也就是1bit,这样做的目的是为了降低内存费用。


keil c有一个特点,就是很多函数不用的时候,很占用内存,大家在编译完后一定要去掉这些东西。

使用特权

评论回复
8
chnycdj| | 2019-10-26 13:19 | 只看该作者
不错不错,学习了!

使用特权

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

本版积分规则

25

主题

136

帖子

0

粉丝