RTThread的finsh在IAR 430上移植的可行性

RTThread的finsh是个好东西,如果想移植到IAR 430平台,是需要一些移植工作的,因为finsh需要重新定义一个section,然后把代码放入指定section;
那么我们来看看在IAR430平台下如何实现这些:
一,链接文件的修改:
以我用的msp430f1611为例,找到lnk430f1611.xcl拷贝一份,找到
// -------------------------------------
// Code
//
-Z(CODE)CSTART,ISR_CODE,CODE_ID=4000-FFDF
-P(CODE)CODE=4200-FFDE
然后修改成:
// -------------------------------------
// Code
//
-Z(CODE)CSTART,ISR_CODE,CODE_ID=4000-FFDF
-P(CODE)CODE=4200-FEFF


// add FSymTab section
-Z(CODE)FSymTab=FF00-FFDF
这样,我们定义了一个FSymTab段落。在IAR的options->linker->config里面选择linker configuratio file,改为我们修改过的;这里我们需要给出FSymTab一个固定的地址空间,与IAR ARM的根据函数自动给FSymTab段落定义空间大小有所区别,显得不够智能。


二,section段落的起始
在finsh_system_init函数内部,我们需要给出FSymTab段落的起始,可以查看IAR linker and library reference guide,找到section的起始与结束的宏:
/* enable IAR extensions, this is necessary to get __sfb and__sfe, it is of course possible to write this function in assembler instead */
我们采用
finsh_system_function_init(__sfb("FSymTab"),__sfe("FSymTab"));

三,代码的保留
在IAR ARM里面,我们在链接脚本里面加入了keep命令来保留section以及定义未使用的函数,在IAR 430默认配置对于定义未使用的函数只是编译但未链接;
我们需要加入__root指令来保留函数:
#define FINSH_FUNCTION_EXPORT(name, desc)                                                     \
    const char __fsym_##name##_name[] = #name;                                                    \  
    __root const struct finsh_syscall __fsym_##name SECTION("FSymTab") =      \
    {                                                                                                                                            \
        __fsym_##name##_name,                                                                                        \
        (syscall_func)&name                                                                                                   \
    }; 

经过上面3个流程,我们就可以完成finsh在IAR 430上的底层移植,后续只需要修改OS的任务实现即可。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RT-Thread FinSH 组件中,可以通过以下两种方式传递浮点型参数: 1. 使用字符串方式传递浮点数 可以将浮点数转换为字符串后,作为命令的参数进行传递。在命令处理函数中,再将字符串转换为浮点数进行处理。 例如,定义一个命令函数 `test`,接收一个浮点数参数: ```c static void test(float value) { // 处理浮点数参数 } MSH_CMD_EXPORT(test, test float parameter); ``` 在命令行中执行该命令时,需要将浮点数转换为字符串进行传递: ``` msh> test 3.14 ``` 在函数中可以使用 `atof` 函数将字符串转换为浮点数: ```c static void test(float value) { float fvalue = atof(value); // 处理浮点数参数 } ``` 2. 使用 4 字节整型传递浮点数 另一种传递浮点数的方式是使用 4 字节整型,将浮点数的二进制表示传递给命令处理函数。 在命令处理函数中,需要将整型参数转换为浮点数进行处理。 例如,定义一个命令函数 `test`,接收一个浮点数参数: ```c static void test(float value) { // 处理浮点数参数 } MSH_CMD_EXPORT(test, test float parameter); ``` 在命令行中执行该命令时,需要将浮点数转换为 4 字节整型进行传递: ```c msh> test 0x40490fdb ``` 在函数中可以使用联合体将整型转换为浮点数: ```c static void test(float value) { union { float f; uint32_t i; } u; u.i = value; float fvalue = u.f; // 处理浮点数参数 } ``` 需要注意的是,这种方式需要保证浮点数和整型的字节序是一致的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值