KEIL MDK之RTX的库方式移植

一、移植前的准备工作

1、建议使用MDK4.74

2、找一个简单的工程模版 比如流水灯的

3、工程模版里面不能有SVC_Handler、PendSV_Handler、SysTick_Handler三个系统中断函数,因为RTX系统要使用这三个函数。


二、RTX库方式的移植

1、准备一个简单的工程模版

                                                                

2、选择RTX系统 如下

3、添加RTX的系统配置文件RTX_Conf_CM.c,配置文件在MDK安装目录的C:\keil\ARM\RL\RTX\Config下面,如图


4、设置配置文件,使其合符自己的芯片

点击系统配置文件RTX_Conf_CM.c,可以看到如下图


点击箭头指示的就可以进入配置,如下图,修改红色框里面的内容


到这里RTX移植就结束了,可以编译一下。

如果出现下面错误,请除掉stm32f4xx_it.c中的SVC_Handler、PendSV_Handler、SysTick_Handler三个系统中断函数函数,因为RTX系统中已经定义了。


如果出现下面错误说 


没有找个RTL.h,可以按照下图设置


这样就可以编译通过。如果还是有问题, 再仔细找找看错在那。


三、编写应用,主要是 利用移植好的RTX操作系统完成 任务的切换观看流水灯是否闪烁

下面是main函数的完整代码



#include "bsp.h" /* 底层硬件驱动 */
#include <RTL.h>




static uint64_t AppTaskLEDStk[256/8];/*任务栈*/
static uint64_t AppTaskStartStk[512/8];/*任务栈*/
/*任务句柄*/
OS_TID HandleTaskLED = NULL;


/*
*********************************************************************************************************
* 函 数 名: AppTaskLED
* 功能说明: LED闪烁的任务
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
__task void AppTaskLED(void)
{
static uint8_t i = 0;
while(1)
{
if(i % 2 == 0)
{
GPIO_ResetBits(GPIOI,GPIO_Pin_10);/*点亮LED*/
}
else
{
GPIO_SetBits(GPIOI,GPIO_Pin_10);/*熄灭LED*/
}
i++;
os_dly_wait(800);/*系统延时函数 因为时钟节拍为1000 所以这里是延时800ms,也就是使AppTaskLED任务挂起800MS*/
}
}
/*
*********************************************************************************************************
* 函 数 名:AppTaskCreate
* 功能说明: 任务创建
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
static void AppTaskCreate(void)
{
HandleTaskLED = os_tsk_create_user(AppTaskLED,            /*任务函数*/
1,                     /*优先级 注意RTX的数字越小,优先级越低*/
&AppTaskLEDStk,        /*任务栈起始地址*/
sizeof(AppTaskLEDStk));/*任务栈大小*/
}
/*
*********************************************************************************************************
* 函 数 名:AppTaskStart
* 功能说明: 开始任务
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
__task void AppTaskStart(void)
{
static uint8_t i = 0;
AppTaskCreate();/*创建AppTaskLED任务*/
while(1)
{
if(i % 2 == 0)
{
GPIO_SetBits(GPIOF,GPIO_Pin_7);/*熄灭LED*/
}
else
{
GPIO_ResetBits(GPIOF,GPIO_Pin_7);/*点亮LED*/
}
i++;
os_dly_wait(500);/*系统延时函数*/
}
}
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形    参:无
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{


/*
ST固件库中的启动文件已经执行了 SystemInit() 函数,该函数在 system_stm32f4xx.c 文件,主要功能是
配置CPU系统的时钟,内部Flash访问时序,配置FSMC用于外部SRAM
*/
bsp_Init();/*硬件初始化*/
os_sys_init_user(AppTaskStart,            /*任务函数*/
2,                       /*任务优先级*/
&AppTaskStartStk,        /*任务栈*/
sizeof(AppTaskStartStk));/*任务栈大小*/
/* 进入主程序循环体 */
while (1)
{
;
}
}

实验现象  : LED灯闪烁

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做了不一定能实现但不做一定不会实现

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值