先来看UC/OS的代码结构,我们必须需要的就是图中红色的框,网上很多对于文件的个数可能不同,其实只是功能多少和环境不同决定的,但都是在这个几个基础上添加的(这里不讨论代码的剪裁操作)!还有注意,网上下载的代码中,Section3可能没有,所以你去网上下载就可以了,到处都是!
#include "os_cfg.h"
这样我们这个操作系统的代码框架已经搞定了,接下来就是配置代码了,其实就是中断的改名字和时钟的设置!
这里我删除了 OS_DBG.C这个文件,为了减少错误就直接删除,不影响!
下面开始修改文件:
第一步:打开os_cfg.h,
把
#define OS_APP_HOOKS_EN 1u
改成
#define OS_APP_HOOKS_EN 0u
第二步 :打开os_cpu_a.asm
把
PUBLIC OS_CPU_SR_Save ; Functions declared in this file
PUBLIC OS_CPU_SR_Restore
PUBLIC OSStartHighRdy
PUBLIC OSCtxSw
PUBLIC OSIntCtxSw
PUBLIC OS_CPU_PendSVHandler
改成
EXPORT OS_CPU_SR_Save ; Functions declared in this file
EXPORT OS_CPU_SR_Restore
EXPORT OSStartHighRdy
EXPORT OSCtxSw
EXPORT OSIntCtxSw
EXPORT OS_CPU_PendSVHandler
把
RSEG CODE:CODE:NOROOT(2)
THUMB
改成
AREA |.text|, CODE, READONLY, ALIGN=2
THUMB
REQUIRE8
PRESERVE8
第三步:打开startup_stm32f10x_md.s
把所有的
PendSV_Handler
替换为
OS_CPU_PendSVHandler
把所有的
SysTick_Handler
替换为
OS_CPU_SysTickHandler
这样就完成了移植了!
最后我随便编了一个PB5口1s高低电平变化的程序,代码如下:
#include "config.h"
#define START_TASK_PRIO 10
#define START_STK_SIZE 64
OS_STK START_TASK_STK[START_STK_SIZE];
void start_task(void *pdata);
#define LED0_TASK_PRIO 7
#define LED0_STK_SIZE 64
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
void led0_task(void *pdata);
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata = pdata;
OS_ENTER_CRITICAL();
OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO);
OS_EXIT_CRITICAL();
}
void led0_task(void *pdata)
{
unsigned int i=2000,j=2000;
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
Delay_ms(1000);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
Delay_ms(1000);
};
}
int main (void)
{
SysTick_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
OSInit();
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );
OSStart();
}
编译烧写入单片机,运行,PB5端口输出周期为2s,占空比为50%的矩形波!