1.下载ucosii源码
https://www.micrium.com/ 注册后选择芯片对应版本下载,手上的芯片为stm32F103ZET6 故下载了对应的IAR版本
2.基于stm32 标准库3.5建立工程
第一步:下载官方3.5的标准库STM32F10x_StdPeriph_Lib_V3.5.0
第二步:使用keil建立工程
a.Project –>New Uvision Project后选择自己所用的CPU后点Cancel
b.进入所建工程目录,删除Listings 和 Objects目录
c.新建目录:STM32F10x_FWLib,STM32F10xCore,OBJS,Function
d.复制文件:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver 下文件—->STM32F10x_FWLib
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport 下文件 —->STM32F10xCore
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm下文件
startup_stm32f10x_hd.s —->STM32F10xCore
startup_stm32f10x_ld.s: 适用于小容量 FLASH≤32K产品
startup_stm32f10x_md.s : 适用于中等容量 64K≤FLASH≤128K产品
startup_stm32f10x_hd.s: 适用于大容量 256K≤FLASH产品
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x 下文件stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h —->STM32F10xCore
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template 下文件 stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h —->STM32F10xCore
Function目录下新建main.c文件
e.工程配置
右键Manage Project将文件添加进去
工程配置C/C++中Define配置STM32F10X_HD,USE_STDPERIPH_DRIVER(大容量STM32F10X_HD,中容量STM32F10X_MD,小容量STM32F10X_LD)
includePaths 指定头文件路径
3.在工程目录下新建UCOSII目录
复制Micrium\Software\uCOS-II\Source下.c文件到UCOSII\src目录下
复制Micrium\Software\uCOS-II\Source下.h文件到UCOSII\inc目录下
复制Micrium\Software\uCOS-II\Ports\arm-cortex-m3\Generic\IAR下文件到UCOSII\inc目录下
将文件分别添加到工程中编译,一堆错误,开始改错。
4.修改提示错误
os_cpu_a.asm:
PUBLIC修改为EXPORT /PUBLIC适用IAR中导出到外部/
RSEG CODE:CODE:NOROOT(2) 修改为
PRESERVE8 /保持堆栈8字节对齐/
AREA |.text|, CODE, READONLY /指定text代码段只读/
THUMBos_dbg.c
修改#define OS_COMPILER_OPT //__rootos_cfg.h
修改#define OS_APP_HOOKS_EN 0
os_cpu_c.c
添加extern INT32U SystemCoreClock;
修改cnts = OS_CPU_SysTickClkFreq() / OS_TICKS_PER_SEC; 为 cnts = SystemCoreClock / OS_TICKS_PER_SEC;os_cpu_a.asm
修改 PendSV_Handler 与 SysTickHandler为
DCD OS_CPU_PendSVHandler ; PendSV Handler
DCD OS_CPU_SysTickHandler ; SysTick Handler
OS_CPU_PendSVHandler\
PROC
EXPORT OS_CPU_PendSVHandler [WEAK]
B .
ENDP
OS_CPU_SysTickHandler\
PROC
EXPORT OS_CPU_SysTickHandler [WEAK]
B .
ENDP
至此编译已不报错
5.编写代码测试
#include "stm32f10x.h"
#include "ucos_ii.h"
#define START_TASK_PRIO 10 //开始任务的优先级设置为最低
#define TASK_STK_SIZE 64 //任务堆栈大小
#define LED1_TASK_PRIO 7 //测试任务1优先级
#define LED2_TASK_PRIO 6 //测试任务2优先级
OS_STK START_TASK_STK[TASK_STK_SIZE];
OS_STK LED1_TASK_STK[TASK_STK_SIZE];
OS_STK LED2_TASK_STK[TASK_STK_SIZE];
/*LED类型*/
typedef enum{
F103_LED1=1, //LED1
F103_LED2, //LED2
}LedType;
void startTask(void *pdata);
void LED1Task1(void *pdata);
void LED2Task2(void *pdata);
void InitLED(void);
void LEDOn(LedType led_type);
void LEDOff(LedType led_type);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
OS_CPU_SysTickInit(); // 系统时钟初始化
InitLED();
OSInit(); //系统初始化
OSTaskCreate(startTask,(void *)0,(OS_STK *)&START_TASK_STK[TASK_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart(); //开启系统
}
void startTask(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata = pdata;
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
OSTaskCreate(LED1Task1,(void *)0,(OS_STK*)&LED1_TASK_STK[TASK_STK_SIZE-1],LED1_TASK_PRIO);
OSTaskCreate(LED2Task2,(void *)0,(OS_STK*)&LED2_TASK_STK[TASK_STK_SIZE-1],LED2_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
}
void LED1Task1(void * pdata)
{
while (1)
{
LEDOn(F103_LED1);
OSTimeDly(500);
LEDOff(F103_LED1);
OSTimeDly(500);
}
}
void LED2Task2(void * pdata)
{
while (1)
{
LEDOff(F103_LED2);
OSTimeDly(500);
LEDOn(F103_LED2);
OSTimeDly(500);
}
}
void InitLED(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PE端口时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_5); //初始化为高
GPIO_SetBits(GPIOE, GPIO_Pin_5); //初始化为高
}
void LEDOn(LedType led_type)
{
switch (led_type)
{
case F103_LED1: GPIO_ResetBits(GPIOB,GPIO_Pin_5);break;
case F103_LED2: GPIO_ResetBits(GPIOE,GPIO_Pin_5);break;
default:
break;
}
}
void LEDOff(LedType led_type)
{
switch (led_type)
{
case F103_LED1: GPIO_SetBits(GPIOB,GPIO_Pin_5);break;
case F103_LED2: GPIO_SetBits(GPIOE,GPIO_Pin_5);break;
default:
break;
}
}