Keil RTX最小系统的实现
- 格式:docx
- 大小:43.39 KB
- 文档页数:5
【原创】结束裸奔时代:Keil RTX最小系统在STR912x上的实现
MDK版本:MDK-ARM Professional Version: 4.23
处理器:STR912FAW4x
目标:最小系统
配置Keil项目
在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的栈大小。RL-ARM User's Guide给的最小值是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
__task void task1 (void) {
while (1) {
// LED闪灯/灭灯等操作
os_dly_wait(50);
}
}
int main(void) {
// 基本的初始化,包括上面说到的“使能和初始化外围”
os_sys_init (task1);
while (1) {
}
}