Anitya 发表于 2005-1-17 16:51:57

WinAvr中嵌入汇编如何使用跳转命令至指定地址?

例如定义一个函数A() 定位于 0x1000

文件中如此使用

#define rcall_A() __asm__ __volatile__ ("rcall 0x1000
")

假设A()在rcall指令的4K范围内.编译后却得不到正确得结果.....

使用icall好像一样有问题.有谁研究过得?

lanmp 发表于 2005-1-17 17:08:57

用c语言的setjump不行么?

kingco 发表于 2005-1-17 17:41:02

用嵌入汇编方式也可以asm("rjmp 0X####");

hotpower 发表于 2005-1-17 18:56:49

声明函数指针

void (*callfuc)(void) = 0x1000;



过程调用

callfuc();

zhonghua_li 发表于 2005-1-17 19:35:37

为什么要这样做,这样太危险了!建议不要这样做

hotpower 发表于 2005-1-17 19:41:22

???????????????????????????????????????

Anitya 发表于 2005-1-18 08:20:05

多谢hotpower,函数指针应该是个好办法.怎么没有想到./emotion/em017.gif

to zhonghua_li :如何说"太"危险了?详细解释下?

to kingco: 嵌入汇编我试过了,或许是我书写方法不对.没有成功,我再试试.

to lanmp: setjmp.h至今没用过,还不敢肯定.. 我去看看.

hotpower 发表于 2005-1-18 12:30:21

哈哈...如果连这点都不具备,岂敢在MCU中"行走江湖"???



那样,非让别人搞成"糨糊"不可...



"非典"少碰点,但不能不沾...

dengchongguang 发表于 2005-1-18 12:40:27

hotpower 确实不错啊!高手中的高手.

hotpower 发表于 2005-1-18 13:02:07

我是菜鸟我怕谁???

Anitya 发表于 2005-1-19 10:29:10

测试过后<除了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);

}

lanmp 发表于 2005-1-19 10:41:44

(*sendChar2)();试试

我一般都是定义一个函数指针类型 typedef void (*void_fp) (void);

然后 void_fp sendchar2;

调用的时候 sendchar2();就行了
-----此内容被lanmp于2005-01-19,10:49:45编辑过

Anitya 发表于 2005-1-19 10:51:53

直接输出sendChar的地址,是0x2E :( 晕.调用0x2E是正确的.... 0x5C只是字节地址,需要的应该是字地址...

Anitya 发表于 2005-1-19 10:54:22

多谢大家了,我的疏忽浪费大家时间了.

Anitya 发表于 2005-1-19 11:32:26

问了许多.自己小结下:

1.flash中寻址是以字进行的,而我们常用的pgm_read_char之类的函数参数却是字节地址!

2.需要如此做法的是为了在bootloader程序和app程序中进行代码的共用.m8空间太小了:(

3.直接操作,猜测还可以一个函数多用,如在switch(status)状态转换中.例行的已知的状态跳转不就方便了?!

diziaihaozhe 发表于 2011-10-12 22:30:54

学习了

改版没改好 发表于 2012-9-26 15:47:37

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)

感谢您。

改版没改好 发表于 2012-9-26 15:50:22

hotpower 发表于 2005-1-18 13:02 static/image/common/back.gif
我是菜鸟我怕谁???

我也在我的帖子里对您表示了感谢,谢谢。
页: [1]
查看完整版本: WinAvr中嵌入汇编如何使用跳转命令至指定地址?