打印
[PIC®/AVR®/dsPIC®产品]

XC8 无法通过绝对地址调用函数?

[复制链接]
1480|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangchui|  楼主 | 2021-11-13 22:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 pzsh 于 2021-12-1 14:35 编辑

如下:在MPLAB X IDE开发环境中(XC8 编译器),将fuc1定位到0x400处,然后通过该地址调用函数,结果发现不能调用,

typedef unsigned char (* func_t)(unsigned char a,unsigned char b);
(1)loacte my fucntion at 0x400
unsigned char fuc1(unsigned char a,unsigned char b)__at(0x400)
{
// a+b;
NOP();
NOP();
NOP();
return a*b;
}
(2) fucntion pointer point to fuc1
func_t ptr = (func_t)(&fuc1);       //用取址符号可以调用
//func_t ptr = (func_t)(0x400)     //直接使用地址无法调用
mmm = ptr(3,9);

使用特权

评论回复
沙发
chuxh| | 2021-11-13 22:25 | 只看该作者
估计定位失败了,然后你取函数地址看看,通过指针。

使用特权

评论回复
板凳
huangchui|  楼主 | 2021-11-13 22:28 | 只看该作者
函数定位和指针地址都对的,估计是编译器不支持这么操作

使用特权

评论回复
地板
huangchui|  楼主 | 2021-11-13 22:30 | 只看该作者

使用特权

评论回复
5
huangchui|  楼主 | 2021-11-13 22:37 | 只看该作者

使用特权

评论回复
6
renyaq| | 2021-11-13 22:45 | 只看该作者
那就是不支持吧,

使用特权

评论回复
7
songqian17| | 2021-11-13 22:50 | 只看该作者
一顿操作猛如虎,回头一看0提升....
写一些通俗易懂, 以后给接手的同事一个容易维护的环境不香么?

使用特权

评论回复
8
renyaq| | 2021-11-13 22:52 | 只看该作者
没这样操作过,不过数量可以绝对定位!

使用特权

评论回复
9
huangchui|  楼主 | 2021-11-13 22:54 | 只看该作者
永远在原地踏步的走,只能沦落为 职业搬砖人

使用特权

评论回复
10
huangchui|  楼主 | 2021-11-13 22:56 | 只看该作者
用途自然是有的,要不然我写这个干嘛,吃饱了撑的

使用特权

评论回复
11
renyaq| | 2021-11-13 22:58 | 只看该作者
有什么用途需要用到绝对地址的调用?

使用特权

评论回复
12
wuhany| | 2021-11-13 23:00 | 只看该作者
要注意,操作绝对地址要特别小心,稍不留神就越界了之类

使用特权

评论回复
13
jiahy| | 2021-11-13 23:05 | 只看该作者
也会给后续的维护带来困扰, 总之,小心为妙.

使用特权

评论回复
14
lizye| | 2021-11-13 23:08 | 只看该作者
调用绝对地址是能省空间和运行速度吗

使用特权

评论回复
15
liliang9554| | 2021-11-13 23:11 | 只看该作者
没有你足够的信息,但我相信你是在PIC16上遇到问题,而不是PIC18,这两个家族由于构架和指令位宽的关系,编译器处理是不一样的。

使用特权

评论回复
16
zhenykun| | 2021-11-13 23:13 | 只看该作者
MCC生成的bootloader跳转用法供你参考
void BOOTLOADER_Initialize ()
{
    if (Bootload_Required () == true)
    {
        Run_Bootloader ();     // generic comms layer
    }
    STKPTR = 0x1F;
    asm ("pagesel " str(NEW_RESET_VECTOR));
    asm ("goto  "  str(NEW_RESET_VECTOR));
}

如果是PIC18的话。。。反汇编给你参考吧
!    // Initialize the device
!    SYSTEM_Initialize();
0x20: CALL 0x220, 0
0x22: NOP
!        pp = SYSTEM_Initialize;
0x24: MOVLW 0x20
0x26: MOVWF pp, ACCESS
0x28: MOVLW 0x2
0x2A: MOVWF 0xC, ACCESS
0x2C: MOVLW 0x0
0x2E: MOVWF 0xD, ACCESS
!        pp = (void*)0x800;
0x30: MOVLW 0x0
0x32: MOVWF pp, ACCESS
0x34: MOVLW 0x8
0x36: MOVWF 0xC, ACCESS
0x38: MOVLW 0x0
0x3A: MOVWF 0xD, ACCESS
!        (*pp)();
0x3C: CALL 0x0, 0
0x3E: NOP

使用特权

评论回复
17
hanwe| | 2021-11-13 23:15 | 只看该作者
楼主能分享一下这样做的好处吗?

使用特权

评论回复
18
huangchui|  楼主 | 2021-11-13 23:17 | 只看该作者

其实还是不大明白,我再琢磨琢磨吧,多谢了哈先

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

918

主题

12323

帖子

4

粉丝