icydream 发表于 2008-8-25 13:52:51

CVAVR 嵌入汇编定义表格 导致程序不能正常运行,请马老师讲解一下

马老师,你好,我最近学习使用CVAVR 编译器定义一段常量到FLASH中,将常量定义到0x00处或其它处,发现程序不能运行了,去掉表格就可以运行,程序如下:
#include <mega16.h>
#include <delay.h>
#define LED PORTB.0

void SetFlashArry(void)
{
#asm
   .CSEG
   .ORG0x1E80
    parameter:
   .DB   0x01, 0x02, 0x03, 0x04, 0x01, 0x01, 0x01, 0x01
   .DB   0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
   .DB   0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
   .DB   0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
#endasm
}


void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0
PORTB=0x00;
DDRB=0x01;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;



LED=0;
delay_ms(4000);
LED=1;
SetFlashArry();
//#asm("JMP0x3800");


while (1)
      {
      PORTB.0=~PORTB.0;
      delay_ms(500);

      };
}

icydream 发表于 2008-8-25 13:53:36

后来发现,定义到哪个地址都不能运行,我现在到单片机试过的;

icydream 发表于 2008-9-11 13:54:00

第一次向马老师发问,等你一万年啊

machao 发表于 2008-9-12 01:23:59

你在那里看到的在CVAVR中嵌入这样的汇编?在C平台中只能嵌入可执行的汇编代码。

认真踏实的学习,把基本的东西和概念掌握好了再“发明创造”吧。否则就是两万年也不会有进步的。

icydream 发表于 2008-9-12 10:30:13

谢谢马老师的批评!我是一直使用C写单片机的,对汇编是不太了解,是看到汇编程序中有这样的定义,尝试了一下;
那还有个问题想再请教下,
我在做产品的时候,由于每个产品的一些参数都会不同,所以需要对每个产品调试后确定参数,原本是
将参数保存到EEPROM中,上电读取的,但是AVR的EEPROM实在不是很可靠,我也增加了掉电预警电路等,但是增加复杂的保护电路又受成本制约,为提高可靠性,所以打算将调试好的参数保存到FLASH中,就不会碰到这样的问题了,这样的话,最好的方法是使用BOOTLOADER写入,但是又碰到一个麻烦的问题:
1:出于减小程序空间考虑,希望将所有参数定义到FLASH中的一个页面中,BOOTLOADER写入的时候,只要写一个页面即可,减小BOOT空间;
2:出于减小程序空间考虑,希望能主程序运行的时候,不用单独去写程序读取FLASH,这样的话,就需要在C中将参数定义到指定的    FLALSH地址保存,在BOOT中写入;

我也已经实现了将常数保存到FLASH中,但是碰到上面的两个问题,想再优化一下,请问马老师,在CVAVR中有没有这样的定义常数数组的方法(定义到指定FLASH指定地址)?一定要全部用汇编写么?或者还有没有其他方法?

icydream 发表于 2008-9-12 10:37:49

马老师,能否给你发邮件请教呢?担心你时间有限,有您的邮件地址也也不敢发啊,

machao 发表于 2008-9-12 11:04:10

使用C平台可以直接定义flash常数数组,但通常不合适指定的地址,而是由编译器分配的。

如果你要在程序中读取指定地址FLASH中的数据,可以定义一个指向FLASH空间的指针。
页: [1]
查看完整版本: CVAVR 嵌入汇编定义表格 导致程序不能正常运行,请马老师讲解一下