首页 / 操作系统 / Linux / 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的任务实现即可。本文永久更新链接地址 :http://www.linuxidc.com/Linux/2014-06/103098.htm
收藏该网址