uCOS-II之移植20160823
首先我们看一下uC/OS-II的框架图:
1.配置文件修改
+------------------------------------------
|core: os_core.c
| os: os_flag.c os_mbox.c
| os_mem.c os_mutex.c
| os_q.c os_sem.c
| os_task.c os_time.c
| os_tmr.c
|head: ucos_ii.h
+------------------------------------------
理论上这几个文件我们完全不用修改!但是,他依赖外部的一些头文件;
app_cfg.h //应用程序的一些功能,目测这里是不需要的;但是他已经写了,那我们就保留吧;所以我们就要先建立一个空的app_cfg.h文件
os_cfg.h //做一些os功能的开关,我们可以由此来对系统进行一些裁剪;保留我们需要的功能;
os_cpu.h //为了适应os,我们必须把os与cpu之间建立一个桥梁;就是通过os_port来进行建立的;
2.cpu文件修改
os_ports
在uCOS-II\Ports\ARM-Cortex-M3\Generic\IAR
os_cpu_c.c //有两个地方要说下:1:在stm32的启动代码里面已经有一些功能函数了,所以我们要把他进行删除,以及他所附带的函数;并在os_cpu.h中注释点他们的外部声明;2:部分宏定义也删除了;(也可以不用修改删除)
#if 0
#define OS_CPU_CM3_NVIC_ST_CTRL (*((volatile INT32U
*)0xE000E010uL)) /* SysTick Ctrl & Status Reg. */
#define OS_CPU_CM3_NVIC_ST_RELOAD (*((volatile INT32U
*)0xE000E014uL)) /* SysTick Reload Value Reg. */
#define OS_CPU_CM3_NVIC_ST_CURRENT (*((volatile INT32U *)0xE000E018uL))
/* SysTick Current Value Reg. */
#define OS_CPU_CM3_NVIC_ST_CAL (*((volatile INT32U
*)0xE000E01CuL)) /* SysTick Cal Value Reg. */
#define OS_CPU_CM3_NVIC_PRIO_ST (*((volatile INT8U
*)0xE000ED23uL)) /* SysTick Handler Prio Reg. */
#define OS_CPU_CM3_NVIC_ST_CTRL_COUNT
0x00010000uL /* Count flag.
*/
#define OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC
0x00000004uL /* Clock Source.
*/
#define OS_CPU_CM3_NVIC_ST_CTRL_INTEN
0x00000002uL /* Interrupt enable.
*/
#define OS_CPU_CM3_NVIC_ST_CTRL_ENABLE
0x00000001uL /* Counter mode.
*/
#define OS_CPU_CM3_NVIC_PRIO_MIN
0xFFu
/* Min handler prio. */
#endif
#if 0
void OS_CPU_SysTickHandler (void)
void OS_CPU_SysTickInit (INT32U cnts)
#endif
os_cpu.h 同样把下面几个外部声明的函数给去掉;
#if 0
/* See OS_CPU_C.C
*/
void OS_CPU_SysTickHandler(void); //系统定时中断处理函数,时钟节拍函数
/*OS_CPU_SysTickHandler()
在 os_cpu_c.c 中定义,是 SysTick 中断的中断处理函 数,而在 stm32f10x_it.c 中已经有该中断函数的定义
SysTick_Handler(),这里也就不需要了。(没有就需要)*/
void OS_CPU_SysTickInit(void); //系统 SysTick 定时器初始化
/*OS_CPU_SysTickInit()
定义在 os_cpu_c.c 中,用于初始化 SysTick 定时器,它 依赖于 OS_CPU_SysTickClkFreq(),也要注释掉。不编写就不注释*/
/*
See BSP.C
*/
INT32U OS_CPU_SysTickClkFreq(void); //返回 SysTick 定时器的时钟频率
/*OS_CPU_SysTickClkFreq()
定义在 BSP.C 中,此函数我们自己会编写,把它注释,不编写就不注释*/
#endif
3.汇编文件修改
os_cpu_a.asm
这部分是汇编代码;由于他里面有部分指令集不适合stm32(匹配),所以我们要稍微改下:
1、将所有的PUBLIC 改为 EXPORT(由于编译器的原因)
2、把自己对齐部分也改下,也是因为指令集不匹配;
; RSEG CODE:CODE:NOROOT(2)
AREA |.text|, CODE, READONLY, ALIGN=2
THUMB
REQUIRE8
PRESERVE8
;CODE表示代码段,READONLY表示只读(缺省) 361. ;ALIGN=2 表示 4 字节对齐。若 ALIGN=n,这
2^n 对齐 THUMB
;Thumb REQUIRE8 ;指定当前文件要求堆栈八字节对齐 PRESERVE8 ;令指定当前文件保持堆栈八字节对齐
注:AREA 一点不能顶头写,这是规定,不然回编译出错;
os_dbg.c
#define OS_COMPILER_OPT __root
这个不兼容,需要把它改下;这个问题也是由编译器不同而产生的。
#define OS_COMPILER_OPT //__root
4. 将ST的官方库导进去即可;
5. 修改库文件
我们也必须要注意,因为我们的移植是使用标
准外设库 CMSIS 中 startup_stm32f10x_hd.s 作为启动文件的,还没有设置 OS_CPU_SysTickHandler。而
startup_stm32f10x_hd.s 文件中,PendSV 中断向量名为 PendSV_Handler,因此只需把所有出现 PendSV_Handler 的地方替换成 OS_CPU_PendSVHandler 即可
startup_stm32f10x_hd.s(系统一开始的启动文件,由此关联到内核)
将 PendSV_Handler 替换成
OS_CPU_PendSVHandler(使用内核的)
原因:SVC(系统服务调用,亦简称系统调用)和 PendSV(可悬起系统调用),它们多用
在上了操作系统的软件开发中。 SVC 用于产生系统函数的调用请求,SVC 异常是必须在执行 SVC 指令后立即得到响应 的。PendSV(可悬起的系统调用)则不同,它是可以像普通的中断一样被悬起的(不像 SVC 那样会上访)。OS 可以利用它“缓期执行”一个异常——直到其它重要的任务完成后才执 行动作。悬起 PendSV 的方法是:手工往 NVIC 的 PendSV 悬起寄存器中写 1。悬起后, 如果优先级不够高,则将缓期等待执行。 PendSV 的典型使用场合是在上下文切换时(在不同任务之间切换)。例如,一个系 统中有两个就绪的任务,上下文切换被触发的场合可以是:
执行一个系统调用l 系统滴答定时器(SysTick)中断。(轮转调度中需要)
stm32f10x_it.c
加头文件: ucos_ii.h,并添加如下代码(如果前面没有注释掉这个函数,这里就不用写,使用前面的):
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
OSIntEnter();
OSTimeTick();
OSIntExit();
}
原因:系统时钟(必须),当系统时钟节拍到了,就进入查询,查看延时的任务以及就绪的任务,主要用于任务切换
os_cfg.h对部分功能进行剪裁(也可以不剪接);
#define
OS_FLAG_EN0
#define OS_MBOX_EN 0
#define OS_MEM_EN 0
#define OS_MUTEX_EN 0
#define OS_Q_EN 0
#define OS_SEM_EN 0
#define OS_TMR_EN 0
#define OS_DEBUG_EN 0
#define OS_APP_HOOKS_EN 0
#define OS_EVENT_MULTI_EN 0
这样算是简单系统以及移植完成了,下面就是写自己的app了;
uCOS-II之移植20160823的更多相关文章
- DE1-SOC开发板上搭建NIOS II处理器运行UCOS II
DE1-SOC开发板上搭建NIOS II处理器运行UCOS II 今天在DE1-SOC的开发板上搭建NIOS II软核运行了UCOS II,整个开发过程比较繁琐,稍微有一步做的不对,就会导致整个过 ...
- ucos ii 46个系统API函数解析
源: ucos ii 46个系统API函数解析
- FreeRTOS 和uCOS II的简单比较
转载:http://www.viewtool.com/bbs/forum.php?mod=viewthread&tid=114 这是两种RTOS, 现在粗略比较一下. freeRTOS比uCO ...
- ucos ii 百度官方介绍
μC/OS II(Micro-Controller Operating System Two)是一个可以基于ROM运行的.可裁剪的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处 ...
- 为什么在ucos向stm32f103移植时说os_cpu_c.c中有三个函数如OS_CPU_SysTickInit()需要注释掉
我在看os_cpu_c.c代码时对下面这段话困惑了半天总是在百度的帮助下找到了答案 /* 申明几个函数,这里要注意最后三个函数需要注释掉,为什么呢? OS_CPU_SysTickHandler ...
- 嵌入式无操作系统下管理内存和队列(类UCOS II思想)
例子:存储日志,最多存128条,每条最大1MB. 内存方面 因为嵌入式不适合用动态内存,会产生碎片.这里我们用 u8 data[LOG_SIZE];开辟固定128MB的内存区,再对其分为128个1MB ...
- uCOS-ii笔记
ucos ii system 文件结构 上层: 应用软件,用户代码 中层: 与处理器无关代码 与应用程序相关配置文件 与处理器有关代码 下层: 硬件(cpu,interupt,timer,gpio,i ...
- ucosII移植
移植ucos II 到一个芯片上,只需要修改下面三个文件:OS_CPU.H,OS_CPU_C.C,OS_CPU_A.ASM. 具体来说,移植主要包括以下几项内容 (1).OS_CPU.H :用#def ...
- uC/OS-II 移植笔记
用过51.AVR.Freescale.STM32,但是写程序一直没有用过实时操作系统,一是因为写的项目不大,二是不太想去看手册学东西.现在写的项目也算比较大,因为需要,所以就学一下,这样也不至于每次的 ...
随机推荐
- 第三篇 Python关于mysql的API--pymysql模块, mysql事务
python关于mysql的API--pymysql模块 pymysql是Python中操作MySQL的模块,其使用方法和py2的MySQLdb几乎相同. 模块安装 pip install pymys ...
- Linux 安装Redis<准备>(使用Mac远程访问)
阅读本文需要一定的Linux基础 一 Redis简介 redis是用c语言编写的一款开源的高性能键值对(key-value)数据库 它通过提供多种键值数据类型来适应不同场景下的存储需求 二 Redis ...
- Laxcus大数据操作系统单机集群版
Laxcus大数据管理系统是我们Laxcus大数据实验室历时5年,全体系全功能设计研发的大数据产品,目前的最新版本是2.1版本.从三年前的1.0版本开始,Laxcus大数据系统投入到多个大数据和云计算 ...
- Office 365 Powershell 连接命令
国内版 第一步: Import-Module msonline Connect-MsolService 输入用户名密码 第二步: Get-MsolUser" 第三步: Set-Executi ...
- 《Cocos2d-x游戏开发实战精解》学习笔记2--在Cocos2d-x中显示一行文字
在Cocos2d-x中要显示文字就需要用到Label控件.在3.x版本的Cocos2d中,舍弃了之前版本所使用的LabelTTF.LabelAtlas.LabelBMFont 3个用于显示文字的类,而 ...
- Fast R-CNN学习总结
Fast R-CNN是R-CNN的改良版,同时也吸取了SPP-net中的方法.在此做一下总结. 论文中讲到在训练阶段,训练一个深度目标检测网络(VGG16),训练速度要比R-CNN快9倍左右,比SPP ...
- Tess4J -4.0.2- Linux 实践 [解决:Tess4J - Native library (linux-x86-64/libtesseract.so) not found in resource path]
[本文编写于2018年7月5日] Tess4J是Tesseract的Java JNA wrapper.本文介绍了在CentOS 7 操作系统中使用Tess4J的步骤及注意事项.在正式开始之前,先花一点 ...
- jupyter通过notedown使用markdown
0 Problem 最近看了下李沐老师的mxnet教程,在使用jupyter的时候打开教程发现全是markdown源文,没有展示markdown格式的文字. 1 Reason 源代码是用markdow ...
- “Hello World!”团队召开的第六次会议
团队“Hello World!”团队召开的第六次会议. 博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.Todo List 六.会议照片 七.燃尽图 一.会议时间 2017年1 ...
- 【java】中缀表达式转后缀表达式 java实现
算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出 ...