嵌入式实时操作系统(RTOS)

一、项目准备工作

1、创建一个标准库项目

这里不用很麻烦,项目能跑就行,后面要以这个项目为基础移植。

2、下载ucOSⅢ源码

ucosⅢ源码:百度网盘链接:提取码:1234(STM32-F107对应版本)
也可以去官网下载:链接,这里就不介绍官网下载的方法了,可以自行搜索。

完成下载后的文件结构是这样的:
在这里插入图片描述

3、创建相应的文件夹

在我们第一步建立的标准库项目中的USER文件夹下新建如下几个文件夹:
在这里插入图片描述

二、开始移植

1.复制文件

转移APP文件夹文件

把我们下载好的源码中对应地址下的这几个文件复制到我们准备好的APP文件夹下:
在这里插入图片描述
在这里插入图片描述

转移BSP文件夹文件

把我们下载好的源码中对应地址下的这几个文件复制到我们准备好的BSP文件夹下:
在这里插入图片描述
在这里插入图片描述

转移uc-CPU文件夹

将该项目转移至自己所创建的项目User目录下:
在这里插入图片描述

工程中添加文件分组

1、在keil项目中创建如下图五个文件夹以对应USER文件夹里的文件:

在这里插入图片描述

2、向“APP”分组添加“User/APP”文件夹下的所有文件:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加效果如下图所示:
在这里插入图片描述

3、向“ BSP”分组添加“ \User\BSP”文件夹下的所有文件:

在这里插入图片描述

4.向“ μC/CPU”分组添加“User\uC-CPU”文件夹下的所有文件和 “ \User\uC-CPU\ARM-Cortex-M3\RealView”文件夹下的所有文件:

在这里插入图片描述

5.向“μC/LIB”分组添加“User\uC-LIB”文件夹下的所有文件和 “User\uC-LIB\Ports\ARM-Cortex-M3\1RealView”文件夹下的所有文件:

在这里插入图片描述

6.向“ μC/OS-III Source”分组添加 “ \User\uCOS-III\Source”文件夹下的所有文件:

在这里插入图片描述

7.向“μC/OS-III Port”分组添加 “User\uCOS-III\Ports\ARM-Cortex-M3\Generic\RealView”文件夹下的所有文件:

在这里插入图片描述

2、添加头文件路径到工程

源码已经添加到开发环境的组文件夹下面,编译的时候需要为这些源文件指定头文件的路径,不然编译会报错,此时我们先将头文件添加到我们的 工程中:

在这里插入图片描述

3、具体的工程文件修改

添加完头文件路径后,我们可以编译一下整个工程,但肯定会有错误的, μC/OS-III 的移植尚未完毕,接下来需要对工程文件进行修改。 首先修改工程的启动文件“ startup_stm32f10x_hd.s”。 其中将PendSV_Handler 和 SysTick_Handler 分别改为OS_CPU_PendSVHandler 和OS_CPU_SysTickHandler,共两处,因为μC/OS官方已经给我们处理好对应的中断函数,就无需我们自己处理与系统相关的中断了, 同时我们还需要将stm32f10x_it.c文件中的PendSV_Handler和SysTick_Handler函数注释掉(不注释也不会有问题):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、修改源码中的bsp.c与bsp.h文件

首先要知道,BSP (Board Support Package)是板级支持包,不同型号的板子对应的bsp文件是不一样的,但是里面的具体内容我们一般不去管,只有一个 BSP_Init()的初始化函数可以在里面实现一些例如电灯或者串口发送等的程序用来测试或者函数调用。这里给出bsp.c修改后的代码

bsp.c


#define  BSP_MODULE
#include <bsp.h>



CPU_INT32U  BSP_CPU_ClkFreq_MHz;



#define  DWT_CR      *(CPU_REG32 *)0xE0001000
#define  DWT_CYCCNT  *(CPU_REG32 *)0xE0001004
#define  DEM_CR      *(CPU_REG32 *)0xE000EDFC
#define  DBGMCU_CR   *(CPU_REG32 *)0xE0042004




#define  DBGMCU_CR_TRACE_IOEN_MASK       0x10
#define  DBGMCU_CR_TRACE_MODE_ASYNC      0x00
#define  DBGMCU_CR_TRACE_MODE_SYNC_01    0x40
#define  DBGMCU_CR_TRACE_MODE_SYNC_02    0x80
#define  DBGMCU_CR_TRACE_MODE_SYNC_04    0xC0
#define  DBGMCU_CR_TRACE_MODE_MASK       0xC0

#define  DEM_CR_TRCENA                   (1 << 24)

#define  DWT_CR_CYCCNTENA                (1 <<  0)




void  BSP_Init (void)
{
   
	//NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4);
	
	//LED_Init (); 
	
}



CPU_INT32U  BSP_CPU_ClkFreq (void)
{
   
    RCC_ClocksTypeDef  rcc_clocks;


    RCC_GetClocksFreq(&rcc_clocks);

    return ((CPU_INT32U)rcc_clocks.HCLK_Frequency);
}




#if ((APP_CFG_PROBE_OS_PLUGIN_EN == DEF_ENABLED) && \
     (OS_PROBE_HOOKS_EN          == 1))
void  OSProbe_TmrInit (void)
{
   
}
#endif




#if ((APP_CFG_PROBE_OS_PLUGIN_EN == DEF_ENABLED) && \
     (OS_PROBE_HOOKS_EN          == 1))
CPU_INT32U  OSProbe_TmrRd (void)
{
   
    return ((CPU_INT32U)DWT_CYCCNT);
}
#endif




#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
void  CPU_TS_TmrInit (void)
{
   
    CPU_INT32U  cpu_clk_freq_hz;


    DEM_CR         |= (CPU_INT32U)DEM_CR_TRCENA;                /* Enable Cortex-M3's DWT CYCCNT reg.                   */
    DWT_CYCCNT      = (CPU_INT32U)0u;
    DWT_CR         |= (CPU_INT32U)DWT_CR_CYCCNTENA;

    cpu_clk_freq_hz = BSP_CPU_ClkFreq();
    CPU_TS_TmrFreqSet(cpu_clk_freq_hz);
}
#endif



#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
CPU_TS_TMR  CPU_TS_TmrRd (void)
{
   
    return ((CPU_TS_TMR)DWT_CYCCNT);
}
#endif
bsp.h
#ifndef  BSP_PRESENT
#define  BSP_PRESENT




#ifdef   BSP_MODULE
#define  BSP_EXT
#else
#define  BSP_EXT  extern
#endif




#include  <stdarg.h>
#include  <stdio.h>

#include  <cpu.h>
#include  <cpu_core.h>

#include  <lib_ascii.h>
#include  <lib_def.h>
#include  <lib_mem.h>
#include  <lib_str.h>

#include "stm32f10x.h"         

#include  <app_cfg.h>

void         BSP_Init                    (void);

CPU_INT32U   BSP_CPU_ClkFreq             (void);



#endif                                                          /* End of module include.                               */

5、修改os_cfg.h(在APP目录下)

#ifndef OS_CFG_H
#define OS_CFG_H


/* --- 其他配置 --- */
#define OS_CFG_APP_HOOKS_EN             1u/* 是否使用钩子函数     */
#define OS_CFG_ARG_CHK_EN               1u/* 是否使用参数检查     */
#define OS_CFG_CALLED_FROM_ISR_CHK_EN   1u/* 是否使用中断调用检查 */
#define OS_CFG_DBG_EN                   1u/* 是否使用debug        */
#define OS_CFG_ISR_POST_DEFERRED_EN     1u/* 是否使用中断延迟post操作*/
#define OS_CFG_OBJ_TYPE_CHK_EN          1u/* 是否使用对象类型检查   */
#define OS_CFG_TS_EN                    1u/*是否使用时间戳     */

#define OS_CFG_PEND_MULTI_EN            1u/*是否使用支持多个任务pend操作*/

#define OS_CFG_PRIO_MAX                32u/*定义任务的最大优先级 */

#define 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值