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

加载位置无关的可执行代码到内存运行,以便扩展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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版