[PIC®/AVR®/dsPIC®产品] XC8 无法通过绝对地址调用函数?

[复制链接]
2087|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 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| huangchui 发表于 2021-11-13 22:37 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
renyaq 发表于 2021-11-13 22:45 | 显示全部楼层
那就是不支持吧,
songqian17 发表于 2021-11-13 22:50 | 显示全部楼层
一顿操作猛如虎,回头一看0提升....
写一些通俗易懂, 以后给接手的同事一个容易维护的环境不香么?
renyaq 发表于 2021-11-13 22:52 | 显示全部楼层
没这样操作过,不过数量可以绝对定位!
 楼主| huangchui 发表于 2021-11-13 22:54 | 显示全部楼层
永远在原地踏步的走,只能沦落为 职业搬砖人
 楼主| huangchui 发表于 2021-11-13 22:56 | 显示全部楼层
用途自然是有的,要不然我写这个干嘛,吃饱了撑的
renyaq 发表于 2021-11-13 22:58 | 显示全部楼层
有什么用途需要用到绝对地址的调用?
wuhany 发表于 2021-11-13 23:00 | 显示全部楼层
要注意,操作绝对地址要特别小心,稍不留神就越界了之类
jiahy 发表于 2021-11-13 23:05 | 显示全部楼层
也会给后续的维护带来困扰, 总之,小心为妙.
lizye 发表于 2021-11-13 23:08 | 显示全部楼层
调用绝对地址是能省空间和运行速度吗
liliang9554 发表于 2021-11-13 23:11 | 显示全部楼层
没有你足够的信息,但我相信你是在PIC16上遇到问题,而不是PIC18,这两个家族由于构架和指令位宽的关系,编译器处理是不一样的。
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
hanwe 发表于 2021-11-13 23:15 | 显示全部楼层
楼主能分享一下这样做的好处吗?
 楼主| huangchui 发表于 2021-11-13 23:17 | 显示全部楼层

其实还是不大明白,我再琢磨琢磨吧,多谢了哈先
您需要登录后才可以回帖 登录 | 注册

本版积分规则

918

主题

12323

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部