WinAvr中嵌入汇编如何使用跳转命令至指定地址?
例如定义一个函数A() 定位于 0x1000文件中如此使用
#define rcall_A() __asm__ __volatile__ ("rcall 0x1000
")
假设A()在rcall指令的4K范围内.编译后却得不到正确得结果.....
使用icall好像一样有问题.有谁研究过得? 用c语言的setjump不行么? 用嵌入汇编方式也可以asm("rjmp 0X####"); 声明函数指针
void (*callfuc)(void) = 0x1000;
过程调用
callfuc(); 为什么要这样做,这样太危险了!建议不要这样做 ??????????????????????????????????????? 多谢hotpower,函数指针应该是个好办法.怎么没有想到./emotion/em017.gif
to zhonghua_li :如何说"太"危险了?详细解释下?
to kingco: 嵌入汇编我试过了,或许是我书写方法不对.没有成功,我再试试.
to lanmp: setjmp.h至今没用过,还不敢肯定.. 我去看看. 哈哈...如果连这点都不具备,岂敢在MCU中"行走江湖"???
那样,非让别人搞成"糨糊"不可...
"非典"少碰点,但不能不沾... hotpower 确实不错啊!高手中的高手. 我是菜鸟我怕谁??? 测试过后<除了setjmp> 都不行.附上测试程序.看看有问题不?我编译后sendChar位于0x5c
#include <avr/io.h>
void sendChar(void)
{
while(!(UCSRA & (1<<UDRE)));
UDR = 0xDD;
}
void (*sendChar2)(void) = sendChar;
// void (*sendChar2)(void) = (void*)0x005c;
void main(void)
{
UCSRB = 0x00;
UBRRH = (7372800/115200/16 - 1)/256;
UBRRL = (7372800/115200/16 - 1)%256;
UCSRA = 0x00;
UCSRB = (1<<TXEN);
while(!(UCSRA & (1<<UDRE)));
UDR = 0xAA;
// sendChar();
// asm volatile ("rcall 0x5c
");
// asm volatile ("ldi r30,0x5c
" "clr r31
" "icall
");
sendChar2();
while(!(UCSRA & (1<<UDRE)));
UDR = 0xBB;
while(1);
} (*sendChar2)();试试
我一般都是定义一个函数指针类型 typedef void (*void_fp) (void);
然后 void_fp sendchar2;
调用的时候 sendchar2();就行了
-----此内容被lanmp于2005-01-19,10:49:45编辑过 直接输出sendChar的地址,是0x2E :( 晕.调用0x2E是正确的.... 0x5C只是字节地址,需要的应该是字地址... 多谢大家了,我的疏忽浪费大家时间了. 问了许多.自己小结下:
1.flash中寻址是以字进行的,而我们常用的pgm_read_char之类的函数参数却是字节地址!
2.需要如此做法的是为了在bootloader程序和app程序中进行代码的共用.m8空间太小了:(
3.直接操作,猜测还可以一个函数多用,如在switch(status)状态转换中.例行的已知的状态跳转不就方便了?! 学习了 hotpower 发表于 2005-1-18 13:02 static/image/common/back.gif
我是菜鸟我怕谁???
您真是高手,我一直在思考直接跳转的方法。
(*((void (*)(void)) 0xf300)) ();,
或者#define test 0xf300
然后(*((void (*)(void)) test)) ();
这样可以直接跳转,但是我想让它带参数跳呢?该怎么办。
您的方法是void (*test)(void) = 0xf300;
然后直接test()就可以转到test函数了
如果定义void (*test2)(char t) = 0xf300;
就可以test(t)
如果定义void (*test3)(char a,char b) = 0xf300;
就可以test(a,b)
感谢您。 hotpower 发表于 2005-1-18 13:02 static/image/common/back.gif
我是菜鸟我怕谁???
我也在我的帖子里对您表示了感谢,谢谢。
页:
[1]