stm32f103移植ucosII.docx
《stm32f103移植ucosII.docx》由会员分享,可在线阅读,更多相关《stm32f103移植ucosII.docx(15页珍藏版)》请在冰豆网上搜索。

stm32f103移植ucosII
2014年5月29日星期四
Author:
wit_yuan
Stm32移植uc/osII到stm32f103vet6上。
版本是v2.86
1、XX
2、进入官网
选择uc/os-II
3、选择cpus
之后进入Downloadcenter
4、选择一个型号的文件下载
如果没有注册的话,进行注册,就能下载文件了。
这里使用的是v2.86版本的stm32f103rb/stm32f103vb系列的进行移植。
4、下载文件
5、压缩
6、开始移植过程
用一个简单的裸机串口打印输出的实验代码,进行这个过程。
工程结构如下:
7、在以上源代码的基础上,添加两个文件夹,工程结构如下:
在此基础上,将下载下来的源代码Micrium->Software->uCOS-II->Source文件夹下的内容复制到ucosii,前提是在USART-DEMO的项目中也添加上两个文件夹ucosii和ucospart。
项目目录结构如下:
8、开始添加ucosii文件夹下的这部分代码:
9、同理,还得添加ucospart部分代码,这就得使用源代码中的Micrium->Software->uCOS-II->Ports->ARM-Cortex-M3->Generic->IAR文件夹下的代码。
10、这部分添加完成之后,可以看一下目录结构
11、试试编译一下:
发生错误
大意就是找不到一些文件,这个时候可以配置一下相关的参数等。
将刚才的添加的两个文件夹的相关.h文件的文件夹添加进来。
差异主要体现在:
12、再次编译,仍旧出现错误,如下:
大意是有一个文件不存在。
App_cfg.h。
报错的是不能打开,其实,源文件里面就是没有这个文件的。
这个时候可以示意性的添加一个这个文件,目前可以设置为空。
13、再次编译一下,会发现还是少一个文件
Os_cfg.h.
这个时候可以从官网下载的源代码中。
Micrium->Software->EvalBoards->ST->STM3210B-EVAL->OS-Probe目录下找到一个os_cfg.h文件。
注意:
我操作的时候,将两个文件夹全部添加到了user目录下
这个只是示意,使用的时候,将这两个从上面移除。
14、再次编译,依旧出现问题
大意是_root没有定义,那么进入这个报错的位置。
将其注释掉:
15、编译,还有错误
意思是有很多的内容没有定义。
16、在ucospart中将os_cpu_a.asm添加到其工程下,进行编译
17、报错如下:
这个时候,要注意的是,汇编代码PUBLIC是必须全部改为EXPORT的。
而且还要将第59行的
RSEGCODE:
CODE:
NOROOT
(2)
进行替换为:
AREA|.text|,CODE,READONLY,ALIGN=2THUMB
REQUIRE8
PRESERVE8
还要修改startup_stm32f10x_hd.s文件中的PendSV_Handler。
这个主要是根据os_cpu_a.asm文件中的OS_CPU_PendSVHandler来的。
需要对应一下。
在第76行,192,193行都替换一下
将os_cpu_c.c文件中的
和
注释掉,方法很简单,就是在voidOS_CPU_SysTickInit(void)上一行加上#if0
函数结束加上#endif。
对于voidOS_CPU_SysTickHandler(void)是同理的。
还要将:
Stm32f10x_it.c中添加:
voidSysTick_Handler(void)
{
OSIntEnter();
OSTimeTick();
OSIntExit();
}
18、编译:
如果继续报错,那么修改os_cfg.h文件中的OS_APP_HOOKS_EN为0,OS_DEBUG_EN为0,里面其实有一些EN的,都可以暂时为0。
这里面的EN为0,能达到一个裁剪的目的。
同时要将#defineOS_TIME_DLY_HMSM_EN1设置好,防止后面程序报错。
19、编译,没有问题,这个时候主要的任务是进行一些应用的测试。
达到测试uc/osii移植成功与否。
20、在app_cfg.h文件中,添加一些内容。
#ifndef__APP_CFG_H__
#define__APP_CFG_H__
/*******************设置任务优先级*******************/
#defineSTARTUP_TASK_PRIO4
#defineTASK_LED2_PRIO5
#defineTASK_LED3_PRIO6
/************设置栈大小(单位为OS_STK)************/
#defineSTARTUP_TASK_STK_SIZE80
#defineTASK_LED2_STK_SIZE80
#defineTASK_LED3_STK_SIZE80
#endif
如下所示:
21、在main.c中添加一些内容
#include"ucos_ii.h"
#include"ucos_ii.h"
OS_STKstartup_task_stk[STARTUP_TASK_STK_SIZE];
voidSysTick_init(void)
{
SysTick_Config(SystemCoreClock/OS_TICKS_PER_SEC);
}
intmain(void)
{
SysTick_init();
USART1_Config();
OSInit();
OSTaskCreate(Task_Start,(void*)0,
&startup_task_stk[STARTUP_TASK_STK_SIZE-1],STARTUP_TASK_PRIO);
OSStart();
return0;
}
完成之后,需要添加一个app.c和一个app.h文件
22、添加两个文件app.c和app.h。
在app.c文件中:
#include"app.h"
#include"ucos_ii.h"
#include"app_cfg.h"
#include"stm32f10x_rcc.h"
#include"stm32f10x.h"
OS_STKtask_2_stk[TASK_2_STK_SIZE];//定义栈
OS_STKtask_3_stk[TASK_3_STK_SIZE];//定义栈
voidTask_Start(void*p_arg)
{
(void)p_arg;//'p_arg'并没有用到,防止编译器提示警告
OSTaskCreate(Task_2,(void*)0,//创建任务2
&task_2_stk[TASK_2_STK_SIZE-1],TASK_2_PRIO);
OSTaskCreate(Task_3,(void*)0,//创建任务3
&task_3_stk[TASK_3_STK_SIZE-1],TASK_3_PRIO);
while
(1)
{
OSTimeDlyHMSM(0,0,0,100);
}
}
//任务2
voidTask_2(void*p_arg)
{
(void)p_arg;
while
(1)
{
printf("----1-----\r\n");
OSTimeDlyHMSM(0,0,0,200);
}
}
//任务3
voidTask_3(void*p_arg)
{
(void)p_arg;
while
(1)
{
printf("----2-----\r\n");
OSTimeDlyHMSM(0,0,0,300);
}
}
在app.h文件中:
#ifndef_APP_H_
#define_APP_H_
/****************用户任务声明*******************/
voidTask_Start(void*p_arg);
voidTask_2(void*p_arg);
voidTask_3(void*p_arg);
#endif//_APP_H_
23、经过以上的步骤,进行编译,运行,程序应该就能达到这样的效果:
这样,就完成将ucosII代码到stm32f103的移植了。
声明:
例程中的串口打印是使用的野火的串口1的polling方式,使用了PA9,PA10
voidUSART1_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
USART_InitTypeDefUSART_InitStructure;
/*configUSART1clock*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
/*USART1GPIOconfig*/
/*ConfigureUSART1Tx(PA.09)asalternatefunctionpush-pull*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*ConfigureUSART1Rx(PA.10)asinputfloating*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*USART1modeconfig*/
USART_InitStructure.USART_BaudRate=9600;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}
因此,可以从野火的哪个源代码进行相应的移植。
同时参考: