本文主要是介绍STM32F103C8T6 移植 μC/OS-ii Keil(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
第一篇我代码的一些复制粘贴,下面就需要进入到工程里面去更改一些东西。
启动文件:startup_stm32f10x_md.s找到下面的函数,更改
更改为:
相应的这个文件下面还有,需要更改:
PendSV_Handler PROCEXPORT PendSV_Handler [WEAK]B .ENDP
SysTick_Handler PROCEXPORT SysTick_Handler [WEAK]B .ENDP
改为:
OS_CPU_PendSVHandler PROCEXPORT OS_CPU_PendSVHandler [WEAK]B .ENDP
OS_CPU_SysTickHandler PROCEXPORT OS_CPU_SysTickHandler [WEAK]B .ENDP
这个是要把原来的STM32的跳转和时钟中断处理更改成操作系统的函数,对应的要把下面的函数的定义改变:
函数的定义在这个文件里面stm32f10x_it.c :
找到
把原来系统的Pend_Handler可以保存或者注释,因为这个其实已经没有用了,相应的跳转函数OS_CPU_PendSVHandler在UCOS的源代码中有(可能我不知道在哪里),但是这个SysTick_Handler需要改成OS_CPU_SysTickHandler,然后还需要编写函数体:
void SysTick_Handler(void)
{ OSIntEnter(); OSTimeTick(); OSIntExit();
}
以上就相当于是可以了的,已经一直完成了,编译之后你可能会出现问题。是因为有些功能你没用的,并不需要,只消找到配置文件将配置改成0就可以。
我遇到的一些问题:
1.头文件的引入错误
include.h文件中,取消掉#include没有的文件比如 #include<bsp.h>
还有://#include <stm32f10x_lib.h>
#include <stm32f10x.h>把上面那个更改成下面这个,这个只是因为我是用的是全新的外设库,上面那个是以前版本的外设库的名字。
现在可以编译了,会发现有很多的错误, 我列举一些我出现过的编译错误:
.\Objects\STM32.axf: Error: L6218E: Undefined symbol App_TaskDelHook (referred from os_cpu_c.o).等
这个是因为我们没有复制粘贴app相关的代码,所以我们没有用这个,找到os_cfg.h中的OS_APP_HOOKS_EN ,把后面的那个1改成0, 我们不使能它。
还有找一下 OS_DEBUG_EN 也不使能,设为0;
#20:identifier "OS_TASK_TMR_PRIO" is undefined
意思是,OS_TASK_TMR_PRIO未定义,因为暂时用不到,先关了,前往os_cfg.h找到以下语句,设为0
#define OS_TMR_EN 0
差不多了,编译不报错的话,就可以修改主函数了
#include "stm32f10x.h"
#include "ucos_ii.h"
#include "os_cpu.h"void LED_Init(void);
void Task_LED(void *p);
void OSTick_Init(void);
void Task_LED2(void *p);//设置任务优先级
#define LED_TASK_PRIO 6
#define LED2_TASK_PRIO 5
//前面有4个任务的优先级是固定的,用户不能使用。//设置任务堆栈大小
#define LED_STK_SIZE 64//任务堆栈
OS_STK LED_TASK_STK[LED_STK_SIZE];OS_STK LED2_TASK_STK[LED_STK_SIZE];int main()
{//LED灯的初始化LED_Init(); //系统初始化OSInit();//初始化系统时钟SysTick_Config(SystemCoreClock /1000);//新建任务LED1OSTaskCreate(Task_LED,(void *) 0,(OS_STK *)&LED_TASK_STK[LED_STK_SIZE-1],(u8)LED_TASK_PRIO);//新建任务LED2OSTaskCreate(Task_LED2,(void *) 0,(OS_STK *)&LED2_TASK_STK[LED_STK_SIZE-1],(u8)LED2_TASK_PRIO);//启动OSStart();return 0;
}
void OSTick_Init(void)
{}
void Task_LED(void *p)
{p = p;while(1){ GPIO_SetBits(GPIOB,GPIO_Pin_6);OSTimeDly(100);GPIO_ResetBits(GPIOB,GPIO_Pin_6);OSTimeDly(100);}
}
void Task_LED2(void *p)
{p = p;while(1){ GPIO_SetBits(GPIOB,GPIO_Pin_7);OSTimeDly(500);GPIO_ResetBits(GPIOB,GPIO_Pin_7);OSTimeDly(500);}
}
void LED_Init()
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);/* Configure PD0 and PD2 in output pushpull mode */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure); }
创建了两个LED任务,不同的时间闪烁,连接线路然后编译下载试一下吧!
两个灯会交替的闪烁,因为周期不一样。如果正常说明前面修改的OS_Pend_SVHandler和OS_SysTickHandler都是没有问题的。
这篇关于STM32F103C8T6 移植 μC/OS-ii Keil(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!