1.下载uCOS-III源码包:链接:https://pan.baidu.com/s/1LDCEb-FI6CjwpeQwLjqjFA 提取码:bswo
2.移植过程如下:(有已经移植好基本ucos-III库:链接:https://pan.baidu.com/s/13_TPVWptemvQhTCyF0gFIw 提取码:y2jd )
1、进入源码包,将 Software 复制到固件库工程中,并且将 Software 名字改为 uCOS-III
2、将 uCOS-III_Template\uCOS-III\uC-CPU\ARM-Cortex-M4 路径下的 GNU 和 IAR 两个文件夹删除
3、将 uCOS-III_Template\uCOS-III\uC-LIB\Ports\ARM-Cortex-M4 路径下的 GNU 和 IAR 两个文件夹删除
4、将 uCOS-III_Template\uCOS-III\uCOS-III\Ports\ARM-Cortex-M4\Generic 路径下的 GNU 和 IAR 两个文件夹删除
5、在 uCOS-III_Template\uCOS-III 路径下新建两个文件夹 APP 和 BSP
6、将 uCOS-III_Template\uCOS-III\EvalBoards\ST\STM32F429II-SK\uCOS-III 路径下的
除 stm32f4xx_conf.h 和 stm32f4xx.h 以外的所有 C文件 和 H文件(总共9个文件)拷贝到 APP 文件夹中
7、将 uCOS-III_Template\uCOS-III\EvalBoards\ST\STM32F429II-SK\BSP 路径下的
bsp.c bsp.h 拷贝到 BSP 文件夹中,最后删除 uCOS-III_Template\uCOS-III 路径下的 EvalBoards 文件夹
8、将uCOS-III的源码加入工程 ,记得添加头文件
10、注意:工程文件中有一把锁说明文件只读,我们需要对文件解锁
对整个工程文件夹右键 --》属性 ---》去掉只读 ---》确定
11、修改文件 bsp.h bsp.c app.c 启动文件
(1)修改bsp.h,注释掉些东西,过程如图,结果看程序
/*
*********************************************************************************************************
* MODULE
*
* Note(s) : (1) This header file is protected from multiple pre-processor inclusion through use of the
* BSP present pre-processor macro definition.
*
* (2) This file and its dependencies requires IAR v6.20 or later to be compiled.
*
*********************************************************************************************************
*/
#ifndef BSP_PRESENT
#define BSP_PRESENT
/*
*********************************************************************************************************
* EXTERNS
*********************************************************************************************************
*/
#ifdef BSP_MODULE
#define BSP_EXT
#else
#define BSP_EXT extern
#endif
/*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/
#include <stdio.h>
#include <stdarg.h>
#include <cpu.h>
#include <cpu_core.h>
#include <lib_def.h>
#include <lib_ascii.h>
/****************************** 后期我们自己写的外设头文件都放在这个位置 ******************************/
//#include <stm32f4xx_conf.h>这是原来的修改为#include "stm32f4xx.h"
#include "stm32f4xx.h"
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void BSP_Init (void);
CPU_INT32U BSP_CPU_ClkFreq (void);
#endif
(2)修改bsp.c,注释掉些东西,过程如图,结果看程序
/*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/
#define BSP_MODULE
#include <bsp.h>
/*
*********************************************************************************************************
* REGISTERS
*********************************************************************************************************
*/
#define BSP_REG_DEM_CR (*(CPU_REG32 *)0xE000EDFC)
#define BSP_REG_DWT_CR (*(CPU_REG32 *)0xE0001000)
#define BSP_REG_DWT_CYCCNT (*(CPU_REG32 *)0xE0001004)
#define BSP_REG_DBGMCU_CR (*(CPU_REG32 *)0xE0042004)
/* - RCC REGISTER DEFINES - */
#define BSP_REG_RCC_BASE_ADDR ((CPU_INT32U)(0x40023800))
#define BSP_REG32_RCC_CR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x00u ))
#define BSP_REG32_RCC_PLLCFGR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x04u ))
#define BSP_REG32_RCC_CFGR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x08u ))
#define BSP_REG32_RCC_CIR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x0Cu ))
#define BSP_REG32_RCC_AHB1RSTR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x10u ))
#define BSP_REG32_RCC_AHB2RSTR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x14u ))
#define BSP_REG32_RCC_AHB3RSTR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x18u ))
#define BSP_REG32_RCC_APB1RSTR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x20u ))
#define BSP_REG32_RCC_APB2RSTR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x24u ))
#define BSP_REG32_RCC_AHB1ENR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x30u ))
#define BSP_REG32_RCC_AHB2ENR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x34u ))
#define BSP_REG32_RCC_AHB3ENR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x38u ))
#define BSP_REG32_RCC_APB1ENR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x40u ))
#define BSP_REG32_RCC_APB2ENR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x44u ))
#define BSP_REG32_RCC_AHB1LPENR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x50u ))
#define BSP_REG32_RCC_AHB2LPENR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x54u ))
#define BSP_REG32_RCC_AHB3LPENR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x58u ))
#define BSP_REG32_RCC_APB1LPENR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x60u ))
#define BSP_REG32_RCC_APB2LPENR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x64u ))
#define BSP_REG32_RCC_BDCR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x70u ))
#define BSP_REG32_RCC_CSR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x74u ))
#define BSP_REG32_RCC_SSCGR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x80u ))
#define BSP_REG32_RCC_PLLI2SCFGR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x84u ))
#define BSP_REG32_RCC_PLLSAICFGR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x88u ))
#define BSP_REG32_RCC_DCKCFGR (*(CPU_REG32 *)( BSP_REG_RCC_BASE_ADDR + 0x8Cu ))
/* - FLASH REGISTER DEFINES - */
#define BSP_REG_FLASH_BASE_ADDR (( CPU_INT32U )(0x40023C00))
#define BSP_REG32_FLASH_ACR (*(CPU_REG32 *)( BSP_REG_FLASH_BASE_ADDR + 0x00u ))
#define BSP_REG32_FLASH_KEYR (*(CPU_REG32 *)( BSP_REG_FLASH_BASE_ADDR + 0x04u ))
#define BSP_REG32_FLASH_OPTKEYR (*(CPU_REG32 *)( BSP_REG_FLASH_BASE_ADDR + 0x08u ))
#define BSP_REG32_FLASH_SR (*(CPU_REG32 *)( BSP_REG_FLASH_BASE_ADDR + 0x0Cu ))
#define BSP_REG32_FLASH_CR (*(CPU_REG32 *)( BSP_REG_FLASH_BASE_ADDR + 0x10u ))
#define BSP_REG32_FLASH_OPTCR (*(CPU_REG32 *)( BSP_REG_FLASH_BASE_ADDR + 0x14u ))
#define BSP_REG32_FLASH_OPTCR1 (*(CPU_REG32 *)( BSP_REG_FLASH_BASE_ADDR + 0x18u ))
/*
*********************************************************************************************************
* REGISTER BITS
*********************************************************************************************************
*/
#define BSP_DBGMCU_CR_TRACE_IOEN_MASK 0x10u
#define BSP_DBGMCU_CR_TRACE_MODE_ASYNC 0x00u
#define BSP_DBGMCU_CR_TRACE_MODE_SYNC_01 0x40u
#define BSP_DBGMCU_CR_TRACE_MODE_SYNC_02 0x80u
#define BSP_DBGMCU_CR_TRACE_MODE_SYNC_04 0xC0u
#define BSP_DBGMCU_CR_TRACE_MODE_MASK 0xC0u
#define BSP_BIT_DEM_CR_TRCENA DEF_BIT_24
#define BSP_BIT_DWT_CR_CYCCNTENA DEF_BIT_00
/* - RCC BLOCK - */
#define HSE_TIMEOUT_VAL 0x0500u
#define BSP_MSK_HSECFG 0x00FF0000u
#define BSP_BIT_RCC_CR_HSION DEF_BIT_00
#define BSP_BIT_RCC_CR_HSEBYP DEF_BIT_18
#define BSP_BIT_RCC_CR_HSEON DEF_BIT_16
#define BSP_BIT_RCC_CR_HSERDY DEF_BIT_17
#define BSP_MSK_RCC_CFGR_HPRE 0x000000F0u
#define BSP_MSK_RCC_CFGR_SYSCLKDIV1 0x00000000u
#define BSP_MSK_RCC_CFGR_SYSCLKDIV2 0x00000080u
#define BSP_MSK_RCC_CFGR_SYSCLKDIV4 0x00000090u
#define BSP_MSK_RCC_CFGR_SYSCLKDIV8 0x000000A0u
#define BSP_MSK_RCC_CFGR_SYSCLKDIV16 0x000000B0u
#define BSP_MSK_RCC_CFGR_SYSCLKDIV64 0x000000C0u
#define BSP_MSK_RCC_CFGR_SYSCLKDIV128 0x000000D0u
#define BSP_MSK_RCC_CFGR_SYSCLKDIV256 0x000000E0u
#define BSP_MSK_RCC_CFGR_SYSCLKDIV512 0x000000F0u
#define BSP_MSK_RCC_CFGR_PPRE1 0x00001C00u
#define BSP_MSK_RCC_CFGR_PPRE2 0x0000E000u
#define BSP_MSK_RCC_CFGR_HCLK_DIV1 0x00000000u
#define BSP_MSK_RCC_CFGR_HCLK_DIV2 0x00001000u
#define BSP_MSK_RCC_CFGR_HCLK_DIV4 0x00001400u
#define BSP_MSK_RCC_CFGR_HCLK_DIV8 0x00001800u
#define BSP_MSK_RCC_CFGR_HCLK_DIV16 0x00001C00u
#define BSP_MSK_RCC_CFGR_SWS_HSI 0x00000000u
#define BSP_MSK_RCC_CFGR_SWS_HSE 0x00000004u
#define BSP_MSK_RCC_CFGR_SWS_PLL 0x00000008u
#define BSP_MSK_RCC_CFGR_SWS 0x0000000Cu
#define BSP_MSK_RCC_CFGR_SW_HSI 0x00000000u
#define BSP_MSK_RCC_CFGR_SW_HSE 0x00000001u
#define BSP_MSK_RCC_CFGR_SW_PLL 0x00000002u
#define BSP_MSK_RCC_CFGR_SW 0x00000003u
/* - PLL BLOCK - */
#define BSP_BIT_RCC_PLLCFGR_PLLM 8u
#define BSP_BIT_RCC_PLLCFGR_PLLN 336u
#define BSP_BIT_RCC_PLLCFGR_PLLP 2u
#define BSP_BIT_RCC_PLLCFGR_PLLQ 7u
#define BSP_BIT_RCC_CR_PLLON DEF_BIT_24
#define BSP_BIT_RCC_CR_PLLRDY DEF_BIT_25
#define BSP_MSK_RCC_PLLCFGR_PLLSRC_HSE 0x00400000u
#define BSP_MSK_RCC_PLLCFGR_RST 0x24003010u
#define BSP_MSK_SYSCLK_SRC_PLLCLK 0x00000002u
#define BSP_MSK_PLLCFGR_PLLSRC_HSE 0x00400000u
#define BSP_MSK_PLLCFGR_PLLSRC_HSI 0x00000000u
/* - FLASH BLOCK - */
#define BSP_BIT_FLASH_ACR_PRFTEN DEF_BIT_08
#define BSP_BIT_FLASH_ACR_ICEN DEF_BIT_09
#define BSP_BIT_FLASH_ACR_DCEN DEF_BIT_10
#define BSP_MSK_FLASHLATENCY_0WS 0x00000000u
#define BSP_MSK_FLASHLATENCY_1WS 0x00000001u
#define BSP_MSK_FLASHLATENCY_2WS 0x00000002u
#define BSP_MSK_FLASHLATENCY_3WS 0x00000003u
#define BSP_MSK_FLASHLATENCY_4WS 0x00000004u
#define BSP_MSK_FLASHLATENCY_5WS 0x00000005u
#define BSP_MSK_FLASHLATENCY_6WS 0x00000006u
#define BSP_MSK_FLASHLATENCY_7WS 0x00000007u
#define BSP_MSK_FLASHLATENCY_8WS 0x00000008u
#define BSP_MSK_FLASHLATENCY_9WS 0x00000009u
#define BSP_MSK_FLASHLATENCY_10WS 0x0000000Au
#define BSP_MSK_FLASHLATENCY_11WS 0x0000000Bu
#define BSP_MSK_FLASHLATENCY_12WS 0x0000000Cu
#define BSP_MSK_FLASHLATENCY_13WS 0x0000000Du
#define BSP_MSK_FLASHLATENCY_14WS 0x0000000Eu
#define BSP_MSK_FLASHLATENCY_15WS 0x0000000Fu
/*
*********************************************************************************************************
* BSP_Init()
*
* Description : Initialize the Board Support Package (BSP).
*
* Argument(s) : none.
*
* Return(s) : none.
*
* Caller(s) : Application.
*
* Note(s) : (1) This function SHOULD be called before any other BSP function is called.
*
* (2) CPU instruction / data tracing requires the use of the following pins :
* (a) (1) Asynchronous : PB[3]
* (2) Synchronous 1-bit : PE[3:2]
* (3) Synchronous 2-bit : PE[4:2]
* (4) Synchronous 4-bit : PE[6:2]
*
* (c) The application may wish to adjust the trace bus width depending on I/O
* requirements.
*********************************************************************************************************
*/
void BSP_Init (void)
{
/*日后自己模块初始化程序就可以在这里调用*/
}
/*
*********************************************************************************************************
* BSP_CPU_ClkFreq()
*
* Description : Read CPU registers to determine the CPU clock frequency of the chip.
*
* Argument(s) : none.
*
* Return(s) : The CPU clock frequency, in Hz.
*
* Caller(s) : Application.
*
* Note(s) : none.
*********************************************************************************************************
*/
CPU_INT32U BSP_CPU_ClkFreq (void)
{
RCC_ClocksTypeDef rcc_clocks;
RCC_GetClocksFreq(&rcc_clocks);
return ((CPU_INT32U)rcc_clocks.HCLK_Frequency);
}
#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
void CPU_TS_TmrInit (void)
{
CPU_INT32U fclk_freq;
fclk_freq = BSP_CPU_ClkFreq();
BSP_REG_DEM_CR |= (CPU_INT32U)BSP_BIT_DEM_CR_TRCENA; /* Enable Cortex-M4's DWT CYCCNT reg. */
BSP_REG_DWT_CYCCNT = (CPU_INT32U)0u;
BSP_REG_DWT_CR |= (CPU_INT32U)BSP_BIT_DWT_CR_CYCCNTENA;
CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);
}
#endif
#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
CPU_TS_TMR CPU_TS_TmrRd (void)
{
CPU_TS_TMR ts_tmr_cnts;
ts_tmr_cnts = (CPU_TS_TMR)BSP_REG_DWT_CYCCNT;
return (ts_tmr_cnts);
}
#endif
#if (CPU_CFG_TS_32_EN == DEF_ENABLED)
CPU_INT64U CPU_TS32_to_uSec (CPU_TS32 ts_cnts)
{
CPU_INT64U ts_us;
CPU_INT64U fclk_freq;
fclk_freq = BSP_CPU_ClkFreq();
ts_us = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);
return (ts_us);
}
#endif
#if (CPU_CFG_TS_64_EN == DEF_ENABLED)
CPU_INT64U CPU_TS64_to_uSec (CPU_TS64 ts_cnts)
{
CPU_INT64U ts_us;
CPU_INT64U fclk_freq;
fclk_freq = BSP_CPU_ClkFreq();
ts_us = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);
return (ts_us);
}
#endif
(3)修改启动文件,注释掉些东西,过程如图,结果看程序
添加
--------------------------------------------------------------------------
DCD OS_CPU_PendSVHandler ; PendSV Handler
DCD OS_CPU_SysTickHandler ; SysTick Handler
---------------------------------------------------------------------------
IF {FPU} != "SoftVFP"
LDR.W R0, =0xE000ED88
LDR R1, [R0]
ORR R1, R1, #(0xF<<20)
STR R1, [R0]
DSB
LDR.W R0, =0xE000EF34
LDR R1, [R0]
AND R1, R1, #(0x3FFFFFFF)
STR R1, [R0]
ISB
ENDIF
----------------------------------------------------------------------
OS_CPU_PendSVHandler PROC
EXPORT OS_CPU_PendSVHandler [WEAK]
B .
ENDP
OS_CPU_SysTickHandler PROC
EXPORT OS_CPU_SysTickHandler [WEAK]
B .
ENDP
到此移植完成。
移植库测试程序app.c 程序下载地址:链接:https://pan.baidu.com/s/1fRAjQrCTwc4NiqF51_mY1Q 提取码:j57x
操作系统运行步骤
1、操作系统初始化
2、初始化我们相应的外设
3、初始化滴答定时器 ---》可以使用操作系统原先设置,也可以使用我们自己写的滴答定时器初始化
4、创建任务(可以多个) ,每一个任务都有一个执行函数
5、开始运行操作系统
修改原有app.c 文件如下:
#include <includes.h>
//定义任务控制块 /* -------
static OS_TCB AppTaskStartTCB;
static OS_TCB AppTask1TCB;
//设置任务的栈空间大小
static CPU_STK AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE];
static CPU_STK AppTask1Stk[128u];
//任务执行函数声明
static void AppTaskStart (void *p_arg);
static void AppTask1 (void *p_arg);
int main(void)
{
OS_ERR err;
// BSP_IntDisAll(); /* Disable all interrupts. */
//1、操作系统初始化
OSInit(&err); /* Init uC/OS-III. */
//2、初始化我们相应的外设
BSP_Init (); //这个函数在 bsp.c 中 ,以后外设初始化都写在这个函数里面
//3、初始化滴答定时器 没有这个初始化 操作系统运行不了 !!!
delay_init(168);
//4、创建任务(可以多个) ,每一个任务都有一个执行函数
OSTaskCreate((OS_TCB *)&AppTaskStartTCB, /* Create the start task */
(CPU_CHAR *)"App Task Start",
(OS_TASK_PTR )AppTaskStart,
(void *)0u,
(OS_PRIO )2u, //优先级
(CPU_STK *)&AppTaskStartStk[0u], //数组首地址表示栈空间基地址
(CPU_STK_SIZE )AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE / 10u],
(CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE,
(OS_MSG_QTY )0u,
(OS_TICK )0u,
(void *)0u,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
OSTaskCreate((OS_TCB *)&AppTask1TCB, //任务1的任务控制块 */
(CPU_CHAR *)"App Task1", //任务1的名字
(OS_TASK_PTR )AppTask1, //任务1的执行函数
(void *)0u, //传给任务1的参数
(OS_PRIO )3u, //任务优先级
(CPU_STK *)&AppTask1Stk[0u], //数组首地址表示栈空间基地址
(CPU_STK_SIZE )AppTask1Stk[128u / 10u], //设置下限,具体多少看你自己,防止栈空间溢出
(CPU_STK_SIZE )128u, //栈空间的大小
(OS_MSG_QTY )0u,
(OS_TICK )0u,
(void *)0u,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
//5、开始运行操作系统
OSStart(&err); /* Start multitasking (i.e. give control to uC/OS-III). */
(void)&err;
return (0u);
}
//起始任务运行函数 优先级高
static void AppTaskStart (void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
printf("AppTaskStart is Created!\r\n");
while(1)
{
CPU_CRITICAL_ENTER(); //关中断
printf("AppTaskStart is Running!\r\n");
CPU_CRITICAL_EXIT(); //开中断
OSTimeDlyHMSM ( 0u, //小时 //睡眠时 系统就开始统计中断次数,当数到2时这个任务就醒过来
0u, //分钟
0u, //秒
2u, //毫秒
OS_OPT_TIME_HMSM_NON_STRICT,
(OS_ERR *)&err);
}
}
//任务1运行函数 优先级低
static void AppTask1 (void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
printf("AppTask1 is Created!\r\n");
while(1)
{
CPU_CRITICAL_ENTER(); //关中断 //对方一进入睡眠状态他就开始执行任务,第一句就是关闭这个中断
printf("AppTask1 is Running!\r\n");
CPU_CRITICAL_EXIT(); //开中断
OSTimeDlyHMSM ( 0u, //小时
0u, //分钟
0u, //秒
2u, //毫秒
OS_OPT_TIME_HMSM_NON_STRICT,
(OS_ERR *)&err);
}
}