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);
};
} 后来发现,定义到哪个地址都不能运行,我现在到单片机试过的; 第一次向马老师发问,等你一万年啊 你在那里看到的在CVAVR中嵌入这样的汇编?在C平台中只能嵌入可执行的汇编代码。
认真踏实的学习,把基本的东西和概念掌握好了再“发明创造”吧。否则就是两万年也不会有进步的。 谢谢马老师的批评!我是一直使用C写单片机的,对汇编是不太了解,是看到汇编程序中有这样的定义,尝试了一下;
那还有个问题想再请教下,
我在做产品的时候,由于每个产品的一些参数都会不同,所以需要对每个产品调试后确定参数,原本是
将参数保存到EEPROM中,上电读取的,但是AVR的EEPROM实在不是很可靠,我也增加了掉电预警电路等,但是增加复杂的保护电路又受成本制约,为提高可靠性,所以打算将调试好的参数保存到FLASH中,就不会碰到这样的问题了,这样的话,最好的方法是使用BOOTLOADER写入,但是又碰到一个麻烦的问题:
1:出于减小程序空间考虑,希望将所有参数定义到FLASH中的一个页面中,BOOTLOADER写入的时候,只要写一个页面即可,减小BOOT空间;
2:出于减小程序空间考虑,希望能主程序运行的时候,不用单独去写程序读取FLASH,这样的话,就需要在C中将参数定义到指定的 FLALSH地址保存,在BOOT中写入;
我也已经实现了将常数保存到FLASH中,但是碰到上面的两个问题,想再优化一下,请问马老师,在CVAVR中有没有这样的定义常数数组的方法(定义到指定FLASH指定地址)?一定要全部用汇编写么?或者还有没有其他方法? 马老师,能否给你发邮件请教呢?担心你时间有限,有您的邮件地址也也不敢发啊, 使用C平台可以直接定义flash常数数组,但通常不合适指定的地址,而是由编译器分配的。
如果你要在程序中读取指定地址FLASH中的数据,可以定义一个指向FLASH空间的指针。
页:
[1]