我们有一个R5F100LE的工程从CS+ for CA,CX 迁移以 CS+ for CC并增加OTA功能。出现在了一些关于指针数据类型的问题,请教一下怎么解决。
首先是我在编译器的Memory model 设置成 Small model(这个设置在无bootloader时,系统可以正常启动运行)。在加了bootloader部分后,无法正常跳转到user部分。
因此又把Memory model改成了 Auto,这样系统可以启动,能跳转到user部分去。
对比了一下,发现在Auto模式下编译出来的函数指针是32位的,而Small model编译出来的函数指针是16位的。
这个又出现了一个新的问题,改成Auto后虽然可以正常启动,但不能正常运行了,因为我的代码里面有用到 void* 以及其它函数指针类型,如
typedef void (*FuncPtr) (void);
typedef void (*FuncPtrExt) (void*);
使用 void* 强制转换后出现问题,编译器显示这个是转换是无效的。
实际使用中原本16位的数据会变成32位 。比如原先的数据用 %p 格式打印出来是 0000B3C2 ,强制转换后就是 000FB3C2。转换后高16位多了 0x000F。
我用sizeof(void*)获取长度是2。因为指针的错误,执行这个函数后就会重启。
请问这个有什么方法可以处理一下?
你不需要设置成small mode, RL78的地址是24bit的, 所以只有使用"auto"就可以了. 如果自己定义, 可以定义uint32_t addr
那0x0000B3C2 的 void*强制转换后 0x000FB3C2 高位多了一个F,是什么情况,因为R5F100LE是64K的,所ROM的地址最大也就是0x0000FFFF。
总线是24bit的, 当然转换后是24bit的数据.