guxingganyue 发表于 2010-10-16 16:28:04

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)

skyhu 发表于 2010-10-16 16:35:51

不要动不动就怀疑是人家的漏洞,先找找自己的漏洞

1、项目文件选择芯片型号了吗?
2、你的工程里有几个文件?有几个main函数?

bbs2009 发表于 2010-10-16 16:42:23

guxingganyue 发表于 2010-10-16 18:03:32

回复【2楼】bbs2009
-----------------------------------------------------------------------

没有

guxingganyue 发表于 2010-10-16 18:05:02

回复【1楼】skyhu
-----------------------------------------------------------------------

1、选了m48
2、就这一个文件




奇怪的是我把上面的代码粘贴到以前的一个例子上,并没有报错,不知为什么

hsztc 发表于 2010-10-16 19:31:57

#define hc595_clkPORTC_PC1

hc595_clk=1;

hc595_clk=0;

这个是怎么做到的,效率怎么样?

h2feo4 发表于 2010-10-16 19:34:04

看上去工程路径中有中文,放到纯英文路径下试试看

guxingganyue 发表于 2010-10-17 13:44:29

回复【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

guxingganyue 发表于 2010-10-17 13:46:15

回复【6楼】h2feo4 无机酸
-----------------------------------------------------------------------

我以前也在中文路径中用都没事的,谢谢啊

guxingganyue 发表于 2010-10-17 13:47:52

问题解决了:重装那个软件后就没有问题了,好像是杀毒软件把有的文件给吃了



谢谢给位的回答啊

fsclub 发表于 2010-10-17 14:32:17

BS怀疑软件的。。。。

bbs2009 发表于 2010-10-17 14:33:16

hsztc 发表于 2010-10-17 15:12:03

(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

后来装了新杀毒软件杀出了好多毒,之后上面的问题就没了...

xtaens 发表于 2010-11-3 12:16:35

mark

snoopyzz 发表于 2010-11-3 13:49:24

【12楼】 hsztc

这还高效吗-_-

iccavr最笨的就是连位域都优化不好....avr的io明明是有位操作指令的...

你换iar,winavr(gcc)位域在IO上应该都是位操作

guxingganyue 发表于 2010-11-3 18:12:35

回复【14楼】snoopyzz
-----------------------------------------------------------------------

楼上的意思是icc不好了?

hsztc 发表于 2010-11-3 19:49:03

【14楼】 snoopyzz

ICC也是有位操作的,比如 PORTB|=(1<<1);PORTB&=~(1<<1); 生成的就是位操作。

如果舍不得多一个周期的话就用上面的。


“你换iar,winavr(gcc)位域在IO上应该都是位操作 ”

这个是你认为的,有部分IO口是不能位操作的。

snoopyzz 发表于 2010-11-4 08:51:56

只有低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)) )

hsztc 发表于 2010-11-5 00:33:36

...

这个宏定义不错,学习了。

hsztc 发表于 2010-11-5 01:21:01

加点内容

#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);      //输出低电平

millwood0 发表于 2010-11-5 05:52:45

"ICCavr6.31a软件的一个漏洞,"

you should learn what compiler optimization is and how to code correctly before making wild claims.

snoopyzz 发表于 2010-11-8 13:16:23

hsztc加的不错,

我就是这么做的,只是没贴全,因为要重新排版...怕麻烦-_-

本BBS贴代码太累...Tab全走样了...

Gorgon_Meducer 发表于 2010-11-8 18:42:47

to 【21楼】 snoopyzz
    就不应该用tab嘛……

qiu452555846 发表于 2010-11-14 23:00:36

ICC不支持16位以上的移位操作。
首先,定义:
#defineBIT(X)   (1 << (X))
然后,使用BIT(0)、BIT(15),皆正常;而使用BIT(16)、BIT(17)等,将出现编绎警告。大意是,16位以上的移位操作未定义。

hsztc 发表于 2010-11-15 00:20:41

【23楼】 qiu452555846

只有不会用的,没有不行的...

#defineBIT(X)   (1ul << (X))

438219660 发表于 2010-11-16 20:44:34

mark
页: [1]
查看完整版本: ICCavr6.31a软件的一个漏洞,大家来看看!!!无语中