您的位置:首页 > 大数据 > 人工智能

结束裸奔时代:Keil RTX最小系统在STR912x上的实现

2011-12-30 00:47 387 查看
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

http://download.csdn.net/detail/zoogar/3983072 -- 中文入门文档
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐