结束裸奔时代:Keil RTX最小系统在STR912x上的实现
2011-12-30 00:47
387 查看
MDK版本:MDK-ARM Professional Version: 4.23
处理器:STR912FAW4x
目标:最小系统
首先,在Targer Option的Operating system里面选上RTX Kernel。
![](http://hi.csdn.net/attachment/201112/29/0_1325177231Hf7h.gif)
复制配置文件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 -- 中文入门文档
处理器:STR912FAW4x
目标:最小系统
首先,在Targer Option的Operating system里面选上RTX Kernel。
![](http://hi.csdn.net/attachment/201112/29/0_1325177231Hf7h.gif)
复制配置文件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 -- 中文入门文档
相关文章推荐
- Keil RTX最小系统在STM32F10x上的实现
- 散户时代的结束,一个巨大阴谋的实现
- 商城项目实战34:单点登录系统SSO最小实现的接口文档及Cookie工具类
- 编写程序:从键盘上输入若干个整数(以输入-1作为结束标识),输出这些数中的最大值和最小值,要求编写一个函数实现最大值和最小值的求取。
- Raspberrypi 3 系统备份还原, 基于最小系统镜像实现
- 使用C/C++编写函数,实现字符串反转,要求不使用任何系统函数,且时间复杂度最小
- Symbian 进行最后一次系统升级 塞班时代结束
- 商城项目实战37:订单系统最小实现接口文档及实现
- Symbian 进行最后一次系统升级 塞班时代结束
- 一个时代的结束:Solaris 系统的那些年,那些事
- 2015年塞班系统消失 诺基亚时代彻底结束
- 一个时代的结束:Solaris 系统的那些年,那些事
- wxpython实现程序最小到系统托盘的一个实例
- Symbian 进行最后一次系统升级,塞班时代结束
- 用LPC2000实现一个最小系统
- Symbian 进行最后一次系统升级,塞班时代结束
- 如果你是来12306系架,你如何实现? ——关于构建安全、稳定、高吞吐量的火车票网络售票系统几个方面(2)结束及总结
- .net实例:WINFORM是实现窗体最小化到系统托盘中
- AvalonDock 2.0+Caliburn.Micro+MahApps.Metro实现Metro风格插件式系统(二)
- java swing实现图书管理系统之Java swing图书管理系统源码与实现