历史上的今天
今天是:2025年01月11日(星期六)
2021年01月11日 | UCOS2_STM32F1移植详细过程(三)
2021-01-11 来源:eefocus
Ⅰ、概述
https://yunpan.cn/cRCZrQ3dzeVQq 访问密码
UCOS基于STM32F1系列实例:
https://yunpan.cn/cRCZxGFsqHa6Q 访问密码
UCOS基于STM32F3系列实例:
https://yunpan.cn/cRCZqPRCWs8UW 访问密码
UCOS基于STM32F4系列实例:
https://yunpan.cn/cRCZPqbFqXSPR 访问密码
UCOS源代码工程
官网下载https://www.micrium.com/downloadcenter/download-results/?searchterm=hm-stmicroelectronics&supported=true
360云盘下载(定期更新至最新):
https://yunpan.cn/cRzcf8eSacEhE 访问密码 1235
ST标准外设库
官网下载(需要账号):
http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software.html?querycriteria=productId=SC961
360云盘下载(定期更新至最新):
https://yunpan.cn/cSaCpGejMSfr8 访问密码 60ae
参考资料:
https://yunpan.cn/cRCdSt73GwT6j 访问密码 499e
Ⅲ、工程目录结构说明
文件结构和工程目录结构对应关系如上图所示。

第一类(标准外设库):
Startup Code:启动代码
STM32F10x_StdPeriph_Driver:标准外设库库驱动
CMSIS:标准接口
第二类(µC/OS-II实时内核):
uC/OS-II Source:内核源代码(与处理器无关)
uC/OS-II Ports:OS端口底层代码(与处理器、编译平台有关)
第三类(用户应用):
Bsp:应用底层代码(初始化、驱动等)
App:应用实现代码(配置OS、应用等)
该文主要针对uC/OS-II Ports进行移植描述。我们不使用UCOS自带的调试功能,这里就不再描述(使用)os_dbg.c文件。
os_cpu_a.asm文件位于工程uC/OS-II Ports结构下面,主要是系统底层相关的一部分汇编代码。
该文件主要对外部引用(全局变量、函数)做了一个申明,及部分系统相关源代码(汇编)做了一个定义。
下面我将定义的几个源代码做一个描述,移植过程需要修改的我会重点提示出来。

该文件开头对全局变量和函数进行了一次声明,只是使用的汇编,就如C语言里面的extern。
上面部分是外部(其他源文件)定义的变量和函数,下面部分是申明本文件定义的函数,下面我会对这定义的源代码进行讲述。
将OS_CPU_PendSVHandler改为PendSV_Handler,为了兼容ST标准外设库启动代码(startup_stm32f10x_hd.s)。

这部分是对NVIC(中断控制)寄存器相关进行定义,就如预处理中宏定义一样,对寄存器地址,状态进行定义。
3.代码生成指令

这几条指令主要是针对汇编指令的一个处理。
4.状态保存与恢复

这两个汇编函数是程序运行在临界区,对数据的保存和恢复的函数。主要作用就是保护数据不被破坏。
5.运行最高优先级任务

这个函数在任务切换的时候调用,知道任务切换原来的朋友来说这里不难理解。UCOS是按优先级来执行任务,优先级越高(优先级数值越小),越容易被执行。当执行的任务处于挂起(或删除)时,系统就需要进行任务切换,切换的规则就是切换到最高优先级去执行。
6.上下文切换

系统切换任务可以从两个地方,也就是从任务级和中断级。这两个函数的意思都一样,当需要执行任务切换时,根据条件执行某一个。

PendSV_Handler中断函数定义于这里,主要是在执行该中断对M3内核寄存器进行一些操作(保存与修改)。
将OS_CPU_PendSVHandler改为PendSV_Handler,为了兼容ST标准外设库启动代码(startup_stm32f10x_hd.s)。
8.总结os_cpu_a.asm
对于UCOS的移植,os_cpu_a.asm文件主要就是修改OS_CPU_PendSVHandler的名称,包含申明时的名称和定义源代码时的名称,其他源代码保持不变。
os_cpu_c.c文件位于工程uC/OS-II Ports结构下面,主要是系统底层相关的一部分C语言接口代码。
该文件有许多HOOK函数,也就是所谓的钩子函数,主要用于系统初始化、与任务相关等,如:系统初始化时OSInitHookBegin()、OSInitHookEnd(); 创建任务时OSTaskCreateHook等。其实我们自己移植,有很多HOOK函数是不需要使用,或者不用去实现函数体里面的代码。下面我将讲述几个重要的函数,有些不重要的HOOK函数不再讲述。
下面我将定义的几个源代码做一个描述,移植过程需要修改的我会重点提示出来。


这些都是关于SysTick系统滴答的宏定义和函数体,由于我们使用M3标准(ST库里面有)的SysTick系统滴答函数接口,我们屏蔽掉os_cpu_c.c里面SysTick相关的定义。

这个函数被OSInit()开头调用,也就是我们main函数开始调用OSInit()就会调用它。
注意:
#if OS_CPU_HOOKS_EN > 0u
也就是需要在os_cfg.h文件里面配置OS_CPU_HOOKS_EN>0.
3.OSTaskStkInit初始化任务堆栈

这个函数比较重要,在创建任务的时候调用它。主要是对芯片内核寄存器进行一个配置,并现场保护数据。这个函数根据芯片内核不同,也存在很大不同。
Ⅶ、配置os_cpu.h文件
os_cpu.h文件位于工程uC/OS-II Ports结构下面,主要是系统底层相关的某些定义(堆栈、数据类型)、申明(函数)等。
该文件下面源代码比较简单,有些不使用,即移植过程需要修改的我会重点提示出来。

这部分是为系统定义相关的数据类型,这里不用修改。

我们使用默认使用临界区第3模式,这个定义主要是与os_cpu_a.asm文件中定义OS_CPU_SR_Save()函数有关。
3.函数申明

函数申明比较简单,这里有几个函数我们在os_cpu_a.asm和os_cpu_c.c文件中都屏蔽掉了的,这里也将他们屏蔽掉。
上一篇:stm32之路:三 约好那一刻
下一篇:STM32F10x_RTC秒中断
史海拾趣
|
这是“工控论坛”中的一个精彩帖子,是版主“totopper ”的帖子,推荐给“单片机”论坛的朋友们看一看! 一个电子工程师的经验之谈 “工程师是科学家;工程师是艺术家;工程师也是思想家。”一位伟大的工程师曾经提出过这样的一段感言。不错,工 ...… 查看全部问答> |
|
用vs2005的.net compact framework2.0开发Wince程序的问题,急! 我用vs2005开发的wince项目,在pc机上可以运行,但放到开发板上之后运行程序则出现Not Supported Exception,我使用了泛型类List,这个类在mscorlib.dll库中,但设备的windows目录下没有这个库,不知道是为什么,裁剪系统时已经加入了.net 2.0的支 ...… 查看全部问答> |
|
大哥大姐们好!小弟这儿有礼了!一定给分! 我在写一个读取串口的程序,但是在其中的sizeof()函数中遇到了问题。当要向串口写数据时,我使用了函数 fWriteStat = WriteFile(hCom, lpBuf, sizeof(lpBuf),&dwHaveNumWritten,NULL); ...… 查看全部问答> |
|
我用IAR3。2,F149的芯片,编程时在定时中断中定义了一个局部变量,硬件仿真时在WATCH窗口中观察此变量有一个初值102(我定义时没复初值),变量地址(LOCATION)被分配为0X9,有时又被分配为0XB,请问高手这个0X9或0XB是指哪的地址,我在MEMORY窗口中 ...… 查看全部问答> |




