STM32F103C8T6 移植 μC/OS-ii Keil(二)

第一篇我代码的一些复制粘贴,下面就需要进入到工程里面去更改一些东西。

启动文件: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都是没有问题的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值