新型IO口定义和#pragma message("")为什么不能在ICC AVR编译器中实现,求
前几天我看见有人在帖子上发表了一片,关于AVR单片机IO的新定义,可以利用一下程序进行初始化:#ifndef __always_inline__
#define __always_inline__#Pragma("inline=forced") inline
#endif
#define AVR_GPIO_ASSIGN(name, port, bit) \
__always_inline__ static void GPIO_##name##_Set(void) {PORT##port |= (1 << bit);}\
__always_inline__ static void GPIO_##name##_Clr(void) {PORT##port &= ~(1 << bit);}\
__always_inline__ static void GPIO_##name##_Toggle(void) {PORT##port ^= (1 << bit);}\
__always_inline__ static ucharGPIO_##name##_Read(void) {return (PIN##port & (1 << bit)) != 0;}\
__always_inline__ static ucharGPIO_##name##_DdrRead(void) {return (DDR##port & (1 << bit)) != 0;}\
__always_inline__ static void GPIO_##name##_MakeOut(uint8 x) {(x)?(PORT##port |= (1 << bit)):(PORT##port &= ~(1 << bit)); DDR##port |= (1 << bit);}\
__always_inline__ static void GPIO_##name##_MakeIn(uint8 x) {DDR##port &= ~(1 << bit); (x)?(PORT##port |= (1 << bit)):(PORT##port &= ~(1 << bit));}\
__always_inline__ static void GPIO_##name##_MakePullup(void) {GPIO_##name##_MakeIn(1);}
#endif
这样的话,在函数中,如果调用
AVR_GPIO_ASSIGN(LED_1,B,0); //LED_1-------PORTB0
AVR_GPIO_ASSIGN(LED_2,B,1); //LED_2-------PORTB1
AVR_GPIO_ASSIGN(KEY,B,2); //KEY---------PORTB2
那么宏定义里面的数据就可以进行处理了。但是在ICC AVR上报错了。
可以教我怎么做吗 傻孩子,给点力了。
还有就是,现在我用宏定义较多,经常会忘记那些已经宏定义过了。在网上看到可以利用
#pragma message ("text")的语句来提示你是否进行了宏定义提示。
但是在ICC AVR上编译出现没有这个语法的用。所以,
有人可以帮我解释一下吗? 最好可以帮我解释一下,#pragma的一些经常的用法,在ICCAVR当中。好像IAR的好多,但是我基本不用那个。所以希望傻孩子可以帮我解决一下这个难题了。
不胜感激 ICC没有那么高档。
#pragma对每一个编译器来说都是不一样的。
ICC非常呆,它没有inline的说法,或者说所有的宏他都是inline的……
详细的内容你还是要看icc的帮助文档哈 嗯,傻孩子,我自己也看了ICC的帮助文档了。但是很少有介绍对于#pragma的用法的介绍的。
傻孩子可以提供一些,关于这个的用法吗
我看了#pragmamessage()对我很有用处的。所以,想让傻孩子帮个忙了。多谢了。 ICC没有#pragma message()这样的用法。
只有一些绝对定位用的。这个你在帮助文档里面能搜索到:
好像有
#pragma abs_address
#pragma text: ...
#pragma data:... 好的。谢谢了。我自己在看看了。 #pragma message()不是所有编译器都有, 建议用#warning代替
页:
[1]