关于MS3程序问题!

[复制链接]
 楼主| 新好男孩 发表于 2007-6-22 15:49 | 显示全部楼层 |阅读模式

typedef void (*Function)(void);
是否等同于:
typedef Function (void (*Function)(void));
还有就是这些指针不是很能理解:
#define MSG_TYPE(u16) ((U8 *)(&u16))[0]
#define MSG_VALUE(u16) ((U8 *)(&u16))[1]
能详细说明吗?
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];
能详细的讲解一下吗??? 
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,是不是觉得看起来有些累啊,指针确实太灵活了,但用好了却很神通。
 楼主| 新好男孩 发表于 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)()

谢谢
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有一个特点,就是很多函数不用的时候,很占用内存,大家在编译完后一定要去掉这些东西。
chnycdj 发表于 2019-10-26 13:19 | 显示全部楼层
不错不错,学习了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

136

帖子

0

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