MDK版本:MDK-ARM Professional Version: 4.23
处理器:STR912FAW4x
目标:最小系统
首先,在Targer Option的Operating system里面选上RTX Kernel。
复制配置文件RTX_Conf_XX.c
从Keil的安装目录中的\Keil\ARM\Startup\里面找到对应处理器的RTX_Conf_XX.c文件,将其复制出来添加到项目里。对于STR912FAW4x,这个文件是\Keil\ARM\Startup\ST\里面的RTX_Conf_STR91x.c。
对于STR912FAW4x跑个最小系统,可以不改这个文件。当然,可修改#define OS_CLOCK这句,以获得正确的系统时钟。
复制并修改启动文件STR91x.s
我一开始使用的是2006版的文件,跑不起来。采用Keil安装目录自带的STR91x.s文件,位置在\Keil\ARM\Startup\ST\,将其复制出来覆盖旧的文件。
接下来修改这个STR91x.s文件。
将这一行注掉:
;SWIHandler B SWIHandler
将这一行
SWI_Addr DCD SWIHandler
修改为:
SWI_Addr DCD SWI_Handler
然后在向上几行的空白处添加:
IMPORT SWI_Handler
上面几步操作的作用是改变了原有的SWI调用,因为RTX内核要用SWI来实现任务调度。
禁止Setup Library Exception Handlers:
LEH_SETUP EQU 0
修改Supervisor Mode的栈大小。手册给的最小值是32字节,对于初学者,在不了解系统的情况下,不妨改大一点:
SVC_Stack_Size EQU 0x00000800
修改91x_it.c文件
如上所述,原有的SWI调用已经被RTX内核取代,因此要将91x_it.c中的SWI_Handler注掉:
#if 0
void SWI_Handler(void)
{
}
#endif
复制并修改retarget.c文件
位置在\Keil\ARM\Startup\
将所有外部调用去掉,修改后的3个函数变为:
int fputc(int ch, FILE *f) {
//return (sendchar(ch));
return 0;
}
int fgetc(FILE *f) {
//return (sendchar(getkey()));
return 0;
}
void _ttywrch(int ch) {
//sendchar (ch);
}
如果不作这些修改的话,系统可能会挂掉。
使能和初始化外围
外围时钟使能:
SCU_AHBPeriphClockConfig(__VIC,ENABLE);
SCU_APBPeriphClockConfig(__TIM01, ENABLE);
外围初始化:
TIM_DeInit(TIM0);
VIC_DeInit();
这4行代码使得用于内核调度的TIM0和SWI中断能够运行,建议在内核初始化os_sys_init调用之前执行。
编写main.c文件
以下是简单的示例:
#include <rtl.h>
__task void task1 (void) {
while (1) {
//LED闪灯/灭灯等操作
os_dly_wait(50);
}
}
int main(void) {
//基本的初始化,包括上面说到的“使能和初始化外围”
os_sys_init (task1);
while (1)
{
}
}
参考资料
http://download.csdn.net/detail/zoogar/3983085 -- Building Applications with RL-ARM - Getting Started
http://download.csdn.net/detail/zoogar/3983081 -- ARM Real-Time Library Training(中文)
http://download.csdn.net/detail/zoogar/3983092 -- RL-ARM User's Guide