第一篇我代码的一些复制粘贴,下面就需要进入到工程里面去更改一些东西。
启动文件:startup_stm32f10x_md.s找到下面的函数,更改
更改为:
相应的这个文件下面还有,需要更改:
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
改为:
OS_CPU_PendSVHandler PROC
EXPORT OS_CPU_PendSVHandler [WEAK]
B .
ENDP
OS_CPU_SysTickHandler PROC
EXPORT 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);
//新建任务LED1
OSTaskCreate(Task_LED,(void *) 0,
(OS_STK *)&LED_TASK_STK[LED_STK_SIZE-1],
(u8)LED_TASK_PRIO);
//新建任务LED2
OSTaskCreate(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都是没有问题的。