你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

加载位置无关的可执行代码到内存运行,以便扩展rtos的功能

[复制链接]
alanyangly 提问时间:2016-8-7 16:00 /
平台:GCC + STM32L476
有时为了扩展系统功能, 但又不想重新编译整个rtos系统, 这个时候就想单独编译一个位置无关的可执行代码。通过蓝牙或者串口什么的传输到设备上,然后拷贝到内存,直接运行, 这样就比较方便灵活, 不用每次为了更新一点东西而重新编译整个系统,还得重新烧录系统。
但是测试时总是报错,不清楚什么原因, 请各位高手,帮忙看看。

//1. 测试代码test.c:
void main( void (*pFunc)(void) )
{         
        pFunc();
}

//2.编译为位置无关的可执行代码
arm-none-eabi-gcc.exe -O3 -fpic -mthumb -mcpu=cortex-m4 -mlittle-endian -c test.c
arm-none-eabi-ld.exe -e main test.o -o test.elf
arm-none-eabi-objcopy.exe -O binary test.elf test.bin
arm-none-eabi-objdump.exe -D -f -b binary -m arm test.bin > test.dis

//3.test.bin反汇编内容
test.bin:     file format binary
architecture: UNKNOWN!, flags 0x00000000:
start address 0x00000000
Disassembly of section .data:
00000000 <.data>:
   0:        bf004700         svclt        0x00004700   

//4.在系统软件里模拟加载test.bin到内存, 然后跳转执行。
uint8_t test_bin_data[] = {//test.bin的内容
        0x00, 0x47, 0x00, 0xBF //其实就是一条跳转指令
};
void test_printf(void)
{
    debug_printf("hello world\r\n");
}

typedef void (*pRunMain)( void (*pFunc)(void) );
//跳转到test.bin所在内存地址运行
pRunMain pRun = (pRunMain) &test_bin_data[0];
pRun(test_printf);  //运行时报HardFaultException错误


从汇编代码来看 是一条svclt指令, 如果编译时不指定-mthumb -mcpu=cortex-m4 , 编译后就是一条arm的跳转指令"bx        r0",
不清楚cortex-m4 的svclt指令有什么特别的, 是否还需要修改SVC中断?




收藏 评论1 发布时间:2016-8-7 16:00

举报

1个回答
alanyangly 回答时间:2016-8-9 19:47:35
已解决

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版