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) {

}

}