|
思路这这样的:
为了测试,需要一个数据块,数据的形式是0x55aa0000,0x55aa0001,0x55aa0002,0x55aa0003 。。。,共n*4个字节,如果放在ram中太浪费,就想直接生成到flash
笨办法就是直接写死,比如
const uint32_t DATA[60]={0x55aa0000,0x55aa0001,0x55aa0002,0x55aa0003 。。。,0x55aa003F};
但是为了能方便调整大小,就考虑用宏递归,而且最好前面的0x55aa也能用宏定义
在asf中有如下的宏
/*! \brief Macro repeat.
*
* This macro represents a horizontal repetition construct.
*
* \param count The number of repetitious calls to macro. Valid values range from 0 to MREPEAT_LIMIT.
* \param macro A binary operation of the form macro(n, data). This macro is expanded by MREPEAT with
* the current repetition number and the auxiliary data argument.
* \param data Auxiliary data passed to macro.
*
* \return <tt>macro(0, data) macro(1, data) ... macro(count - 1, data)</tt>
*/
#define TPASTE2( a, b) a##b
#define MREPEAT(count, macro, data) TPASTE2(MREPEAT, count)(macro, data)
#define MREPEAT0( macro, data)
#define MREPEAT1( macro, data) MREPEAT0( macro, data) macro( 0, data)
#define MREPEAT2( macro, data) MREPEAT1( macro, data) macro( 1, data)
#define MREPEAT3( macro, data) MREPEAT2( macro, data) macro( 2, data)
#define MREPEAT4( macro, data) MREPEAT3( macro, data) macro( 3, data)
#define MREPEAT5( macro, data) MREPEAT4( macro, data) macro( 4, data)
#define MREPEAT6( macro, data) MREPEAT5( macro, data) macro( 5, data)
#define MREPEAT7( macro, data) MREPEAT6( macro, data) macro( 6, data)
。。。。
#define MREPEAT256(macro, data) MREPEAT255(macro, data) macro(255, data)
然后我用这个宏来生成自增定义
#define KEY_HEADER 0x55aa0000
#define X 16
#define Y 4
#define KEY_SIZE X*Y
#define KEY_HEADER_PLUS(c,d) c+d,
const uint32_t DATA[KEY_SIZE]={ // 160 bytes = 40 words
MREPEAT(KEY_SIZE, KEY_HEADER_PLUS, KEY_HEADER)
};
期望得到的结果是:
const uint32_t DATA[KEY_SIZE]={ // 160 bytes = 40 words
0x55aa0000,0x55aa0001,0x55aa0002,0x55aa0003 。。。,0x55aa003F,
};
但是上面的那段程序总是报错,无法通过编译
pasting "MREPEAT" and "(" does not give a valid preprocessing token
不知道问题出在哪里?
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|