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的任務實現即可。