uTenux现在已经之类几乎所有主流的cortex M的开发板,比如:ATMEL(爱特梅尔)、Cypress(赛普拉斯)、Freescale(飞思卡尔)、Infineon(英飞凌)、Nuvoton(新唐)、NXP(恩智浦)、SiliconLabs、Spansion、ST(意法半导体)、TI(德州仪器)。uTenux支持3个开发环境,IAR、Keil、uTstudio(悠龙开发套件)。正对个别开发板还进行支持其特有的开发环境,比如Cypress的PSoC Creator,ATMEL的Studio由于不能创建组(虚目录)暂时没有支持等...
介绍一下uTenux在cortex M系列上的移植方法,简单叙述一下在Coretex M系列之间怎么进行移植。因为Cortex M系类具有统一的NVIC管理,统一的内存划分。所以这样比较容易。
简单通俗了说移植uTenux就是:
1.根据具体开发板的中断数目修改启动文件。
2.根据具体开发板的Flash和SRAM的大小修改链接脚本。
3.实现UART的收发函数(bsp)。
4.修改配置文件文件。
下图红色框内是移植相关部分:
1.修改启动文件startup.S:通过芯片手册找到该芯片支持的中断数目(不大于255),然后修改启动文件中中断向量号多删少补到该芯片实际数目中断数目减1。都写成default_handler,因为uTenux支持动态修改定义向量表(M0除外,M0芯片假如用到了外设中断,需要手动修改相应default_handler为中断函数)。
2.修改链接脚本uTenux-flash:IAR链接脚本后缀名为icf、Keil链接脚本后缀名为sct、uTStudio链接脚本的后缀名为ld。通过查阅芯片手册得到芯片的Flash和SRAM的大小。通过修改链接脚本来配置uTenux各个节的大小,Flash配置为实际的大小,SRAM分配给各个节,注意不要超过SARM的实际大小就好。一般向量表配置大小为向量个数*4转成16进制;BSSDATA段一般分配7K左右(要是配置的系统对象多的话,需将其调大点);用户区一般分配4K;栈区分配0K,这个并不是说不使用栈空间,而是因为cortexM的栈时向下增长的,这样的话就会占用的用户区的一部分空间,幸好这个栈就是刚刚启动的时候使用,当uTenux内核起来以后这部分空间就没有用了,覆盖了也没有事;系统区是uTenux运行时使用的空间比如任务栈空间,一般是将SRAM剩余的所有空间都分到这里。这个分配方法仅供参考,具体可以根据实际情况作调整,系统区分配的最大并不代表系统需要占很大的空间,只是为了写应用程序好扩展而预留的。
3.实现bsp函数,其实就是UART和看门狗,这些函数在tm_bsp.c中。这些其实不是uTenux运行时必要的,实现它完全是为了打印一些提示信息,在实际应用中,完全可以再配置文件中将TK_USE_MESSAGE选项关掉,不让其输出。在这个文件中如果该芯片没有FPU完全可以将相关的代码移除掉,也可以通过关掉配置文件中的使用FPU开关宏将其关掉。主要有初始化flash(很多芯片无需设置);初始化时钟(uTenux默认跑在最高频);初始化看门狗(也就是将其关闭);初始化UART;然后将UART的收发函数体也实现了。具体怎么设置可以通过参考芯片生产商提供的官方例程中扒过来。这里用到了外设库,所以这个也需要添加工程中。
4.修改配置文件tk_config_depend.h。这个文件使用来配置uTenux的,比如systick中断频率,系统对象的数目,是否使用FPU,是否开启debug,和hook选项,是否打印信息等。在这里不用管那么多,只需要修改几个地方就行,首先还是分配Flash和SRAM空间,一定要和链接脚本的配置相同哦,至于这里还需要配置一次,大概是为了uTenux在各个芯片上移植的方便性,和以后uTenux继续划分存储空间的灵活性。TK_ROM_VECTOR_NUMBER和TK_RAM_VECTOR_NUMBER配置成该芯片实际的中断向量的数目。其次修改时钟KNL_CFG_TIMER_CLOCK为刚才bsp中所配置的频率,单位为MHz。最后是锦上添花的操作,将KNL_CFG_BOOT_MESSAGE提示信息修改为所移植的开发板的名称。
至此,修改代码的部分大体上就完成了。
需要注意的是如果移植的是如果移植的芯片如果是M0的话,会报BSSDATA段空间不足的错误,此时建议将系统对象配置的少一点。毕竟M0的空间比较少。
以上修改都是针对代码的,以下是针对工程的。
因为代码改完了,如果对开发环境不熟悉的话编译还是会有很多错误的。因为芯片变了可能使用的ARM指令集不一样,使用的外设库不一样,编译头文件搜索路径可能没有修改正确,条件编译宏可能没有设正确。这些都是需要修改的。IAR和Keil相似,uTStudio使用的是GCC工具链配置需要配的地方比较多。如果有必要择日再续一贴。