ICCavr6.31a软件的一个漏洞,大家来看看!!!无语中
下面的代码我怎么编译都提示相同的错误,即使只留下main函数,都报相同的错误,,,,无语中,请高手指点#include<iom48v.h>
#include<macros.h>
#include ".\head\ICC_AVRPORTBit.h"
/************74HC595端口定义***************/
#define hc595_data PORTC_PC2
#define hc595_clkPORTC_PC1
#define hc595_stcp PORTC_PC0
void hc595_send_byte(unsigned char byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
hc595_data=byte&1<<i;
hc595_clk=1;
hc595_clk=0;
}
}
void hc595_send_int(int data1,int data2)
{
hc595_send_byte(data1);
hc595_send_byte(data2);
hc595_stcp=1;
hc595_stcp=0;
}
void main()
{
int i;
while(1)
{
hc595_send_byte(0xee);
}
}
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_590293CZ58UO.jpg
(原文件名:未命名.jpg) 不要动不动就怀疑是人家的漏洞,先找找自己的漏洞
1、项目文件选择芯片型号了吗?
2、你的工程里有几个文件?有几个main函数? 回复【2楼】bbs2009
-----------------------------------------------------------------------
没有 回复【1楼】skyhu
-----------------------------------------------------------------------
1、选了m48
2、就这一个文件
奇怪的是我把上面的代码粘贴到以前的一个例子上,并没有报错,不知为什么 #define hc595_clkPORTC_PC1
hc595_clk=1;
hc595_clk=0;
这个是怎么做到的,效率怎么样? 看上去工程路径中有中文,放到纯英文路径下试试看 回复【5楼】hsztc
-----------------------------------------------------------------------
我参考傻孩子的头文件写的:
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=444826&bbs_page_no=1&search_mode=4&search_text=xtaens&bbs_id=9999 回复【6楼】h2feo4 无机酸
-----------------------------------------------------------------------
我以前也在中文路径中用都没事的,谢谢啊 问题解决了:重装那个软件后就没有问题了,好像是杀毒软件把有的文件给吃了
谢谢给位的回答啊 BS怀疑软件的。。。。 (0111) _PD1 = 1;
_main:
00035 B382 IN R24,0x12
00036 6082 ORI R24,2
00037 BB82 OUT 0x12,R24
(0112)
(0113) _PD1 = 0;
00038 B382 IN R24,0x12
00039 7F8D ANDI R24,0xFD
0003A BB82 OUT 0x12,R24
哈哈,相当高效,虽然不是位操作,但跟位操作只差一个时钟周期。
以前我电脑中毒的时候也出现类似的问题,以前是重装完后把bin这个文件夹压缩起来备份,
一出问题就解压覆盖掉原来的bin就可以正常使用了,但基本一重启电脑又出问题了,又要解压bin
后来装了新杀毒软件杀出了好多毒,之后上面的问题就没了... mark 【12楼】 hsztc
这还高效吗-_-
iccavr最笨的就是连位域都优化不好....avr的io明明是有位操作指令的...
你换iar,winavr(gcc)位域在IO上应该都是位操作 回复【14楼】snoopyzz
-----------------------------------------------------------------------
楼上的意思是icc不好了? 【14楼】 snoopyzz
ICC也是有位操作的,比如 PORTB|=(1<<1);PORTB&=~(1<<1); 生成的就是位操作。
如果舍不得多一个周期的话就用上面的。
“你换iar,winavr(gcc)位域在IO上应该都是位操作 ”
这个是你认为的,有部分IO口是不能位操作的。 只有低32个IO是可以位操作的,我懂AVR汇编的....
另外不只是多一个周期的事,多了好几个字节-_-
位域在这个32个IO上的操作明明应该转化成位操作的....ICCAVR这点笨我有说错??
我在ICCAVR 中只好用宏定义出GPIO_OUT0(LED1); GPIO_OUT1(LED1); 或者GPIO_OUT(LED1, 0); GPIO_OUT(LED1, 1);的方式,就是用|= &=~实现的
#define LED1 A,1
#define GET_PORT(x, bit) (PORT ## x)
#define GET_PIN( x, bit) (PIN ## x)
#define GET_BIT( x, bit) (bit)
#define GET_REG( x, bit) (x)
#define GPIO_OUT1(portx_bit) ( GET_PORT(portx_bit) |=BIT(GET_BIT(portx_bit)) )
#define GPIO_OUT0(portx_bit) ( GET_PORT(portx_bit) &= ~BIT(GET_BIT(portx_bit)) ) ...
这个宏定义不错,学习了。 加点内容
#define LED1B,1 //PB1接LED1
#define KEY1B,2 //PB2接按键
#define GET_PORT(x, bit) (PORT ## x)
#define GET_DDR( x, bit) (DDR ## x)
#define GET_PIN( x, bit) (PIN ## x)
#define GET_BIT( x, bit) (bit)
#define GPIO_IN(pinx_bit) ( GET_PIN(pinx_bit) & ( 1<< GET_BIT(pinx_bit) ) )
#define GPIO_OUT1(portx_bit) ( GET_PORT(portx_bit) |=(1<<GET_BIT(portx_bit)) )
#define GPIO_OUT0(portx_bit) ( GET_PORT(portx_bit) &= ~(1<<GET_BIT(portx_bit)) )
#define GPIO_DDR_OUT(ddrx_bit) ( GET_DDR(ddrx_bit) |=(1<<GET_BIT(ddrx_bit)) )
#define GPIO_DDR_IN(ddrx_bit)( GET_DDR(ddrx_bit) &= ~(1<<GET_BIT(ddrx_bit)) )
GPIO_DDR_IN(KEY1); //KEY1的端口设为输入
GPIO_OUT1(KEY1); //KEY1的端口带上拉
GPIO_DDR_OUT(LED1); //LED1的端口设为输出
if(GPIO_IN(KEY1)==0)//读按键
GPIO_OUT0(LED1); //输出电电平
else
GPIO_OUT1(LED1); //输出低电平 "ICCavr6.31a软件的一个漏洞,"
you should learn what compiler optimization is and how to code correctly before making wild claims. hsztc加的不错,
我就是这么做的,只是没贴全,因为要重新排版...怕麻烦-_-
本BBS贴代码太累...Tab全走样了... to 【21楼】 snoopyzz
就不应该用tab嘛…… ICC不支持16位以上的移位操作。
首先,定义:
#defineBIT(X) (1 << (X))
然后,使用BIT(0)、BIT(15),皆正常;而使用BIT(16)、BIT(17)等,将出现编绎警告。大意是,16位以上的移位操作未定义。 【23楼】 qiu452555846
只有不会用的,没有不行的...
#defineBIT(X) (1ul << (X)) mark
页:
[1]