uC/OS-II成功移植在STM32 上了,虽然理解还不是很深刻,但大体明白移植方法,以前曾经将uC/OS-II移植到MSP430F1611上,但是也没关注那么多,现在按照网友的介绍进行移植,下载官方的V2.86版本的固件,自己建工程,修改Port部分,建立两个任务,但是调试时死在程序死在了OSStart();里。经过单步发现程序的软件中断触发后调用服务函数失败,停在了
OSStartHang B OSStartHang //停在这里,而且这里正常情况下不应该在这的;
然后就开始查问题,最终解决。发现无论学什么,一定要知其然知其所以然,不然学的永远都只是皮毛。现在把自己的移植过程和理解记录下来。
下载将官方的库,Port部分是需要修改的部分,Source部分不用修改。
(1)OS_CPU.h文件下面定义类型名称,堆栈类型OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()选方法3是最合适的;定义栈增长方向,STM32是高地址向低地址增长的,所以#define OS_STK_GROWTH 1 ;
另外再定义几个函数。直接参考移植程序,这里不做说明了。注意一点的是要屏蔽掉有关Systick的几个函数,OS_COU_C.c文件里的有关函数也要屏蔽,这是因为我们在自己的程序里自己去定义我们需要的Systick函数。
(2)OS_CPU_C.c文件定义了OSTaskStkInit()函数和一些Hook函数,OSTaskStkInit()是任务切换时候用到的,Hook函数书操作系统给用户扩展用的,因为操作系统轻易不能让用户修改,故留出一些接口供用户扩展。
如上所述,屏蔽掉涉及Systick的函数和一些宏定义;
(3)OS_CPU_A.asm是一些用汇编写的函数,直接复制粘贴,需要修改的地方后面详细介绍。
uC/OS-II移植时有两个重要的中断,一个是SysTick_Handler(),还一个是PendSV_Handler()。SysTick是心跳信号,SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基。OS 都需要这种“滴答”来推动任务和时间的管理。。PendSV挂起中断操作,它的典型应用是进行任务切换,操作系统在实际运行中具体会出现这样的问题,就是在任务切换的时候发生中断,中断必须得到响应,保证它的实时性,否则后果是不堪想象的。那么在 ISR 执行过程中,发生SysTick 异常,并且抢占了该ISR,OS 执行必要的操作,然后pend 起PendSV 异常以作好任务切换的准备,重新回到中断,中断完成后再进行任务切换,具体参考《Cotex-M3权威指南》7.6节。如下图:
再介绍一下另外几个文件,在stm32f10x_it.h函数中的都是一些中断入口函数,有SysTick_Handler()、PendSV_Handler()等函数,在CMSIS启动文件中定义了这些中断的入口地址,包括SysTick_Handler()、PendSV_Handler()等,这样就对应起来了,启动文件直接可以找到入口函数。OS需要心跳时钟,所以我们直接在程序里初始化SysTick函数,在SysTick_Handler()函数中调用OSIntEnter();OSTimeTick();OSIntExit(),这很好理解了,就是把操作系统的时钟和硬件时钟对接上了。所以也就不需要OS_CPU.h和OS_CPU_C.c中的SysTick相关的定义了。
但官方为什么要在OS_CPU.h和OS_CPU_C.c中定义OS_CPU_SysTickHandler()这个名称的函数呢?其实在stm32f10x_it.h中已经定义了SysTick_Handler()函数,这是因为官方用的是他自己的启动文件(两个文件init.s,vectors.s。init.s负责进入main(),vectors.s 设置中断向量。),他的启动文件中的入口中断地址名称OS_CPU_SysTickHandler()。同样在启动文件中他也自己定义了OS_CPU_PendSVHandler()函数,所以在OS_CPU_A.asm中定义的入口函数也是OS_CPU_PendSVHandler()。而我们的启动文件是PendSV_Handler()。所以我前面遇到的卡死就是因为PendSV中断没找到对应的中断处理函数。所以可以修改OS_CPU_A.asm,将OS_CPU_PendSVHandle全部替换成PendSV_Handler(),并且屏蔽掉stm32f10x_it.h中的PendSV_Handler()。另一种方法是只用修改启动文件,将PendSV_Handler()替换成OS_CPU_PendSVHandle()即可。
另外介绍两个文件,一个是OS_cfg.h和App_cfg.h,这是两个配置文件,OS_cfg.h是对OS进行配置,比如OS_TICKS_PER_SEC配置、OS_TIME_DLY_HMSM_EN等对用到的模块进行使能操作。App_cfg.h是用户自己按需要添加的,主要是设置任务堆栈大小,任务优先级等。
这是我移植过程中学到的,菜鸟起步,理解还不是很深,难免有误,欢迎指正。
关键字:STM32 移植 uCOS-II
引用地址:
STM32移植uC/OS-II总结
推荐阅读最新更新时间:2024-03-16 14:51
STM32开发笔记90: SX1268驱动程序设计(数据缓存)
单片机型号:STM32L053R8T6 本系列开发日志,将详述SX1268驱动程序的整个设计过程,本篇介绍数据缓存的相关驱动程序。 一、工作原理 二、接收模式的数据缓存 In receive mode RxBaseAddr specifies the buffer offset in memory at which the received packet payload data will be written. The buffer offset of the last byte written in receive mode is then stored in RxDataPointer which is init
[单片机]
STM32学习笔记(1):GPIO口的使用
实验平台清单如下: 开发板:奋斗STRIVE V3 核心芯片: STM32F103VET6 开发环境: RealView MDK-ARM Version:3.50 PC操作系统: Windows 7家庭普通版 仿真器: SEGGER J-Link 其中,STM32F103VET6芯片是基于ARM Cortex-M3内核的,具体技术参数请参考ST公司给出的芯片资料( http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00191185.pdf )。关于该芯片的其他资料,可以在 http://www.st.com/cn/
[单片机]
CRC校验 、STM32中CRC计算单元、 CRC应用
从这一段时间后台反馈的问题可以看得出来,好些朋友对CRC没有什么概念,今天就在这里讲述一下关于CRC校验、STM32中CRC计算单元相关内容。 1关于CRC校验 CRC:Cyclic Redundancy Check,即循环冗余校验码。 CRC是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。 循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 ---来自百度百科 学电子、计算机相关专业的同学都应该学习过CRC的基础原理。其原理说难不难,可以说就是一个公式。同时,说简单也不简单,这个公
[单片机]
一文详解STM32的嘀嗒时钟(SysTick)
简要说明 1概述 嘀嗒时钟(SysTick)是一个简单的系统时钟节拍计数器,它属于Cortex-M4内核嵌套向量中断控制器(NVIC)里的一个功能单元。他是一个24位的倒计时定时器(在NVIC中),当systick计数值到0的时候,SysTick重装载寄存器就会自动重新装载初值。只要SysTick控制和状态寄存器(CTRL)中的使能位没有ENABLE清除掉,那么就会永远的执行下去。 SysTick定时器被捆绑在NVIC中,可产生SysTick异常(异常号:15),属于Cortex-M4内核里的一个功能单元。 SysTick常作为系统节拍定时器用于操作系统(如mCOS-Ⅱ、FreeRTOS等)的系统节拍定时,从而推动任务和时间的
[单片机]
STM32学习笔记一一HEX文件和BIN文件格式
1. 引言 今天看串口的 IAP ,平时我们通过 JTAG 等工具下载的都是 HEX 文件,都没有思考一下 HEX 的文件组成。而串口 IAP 下载的是 BIN 文件,刚好在这里区分学习一下。 我们平时烧写 HEX 文件是不需要设置地址信息的,因为已经包含在文件里面,而使用 BIN 烧写,需要在程序中指定地址。 2. 简述 Intel hex 文件是记录文本行的 ASCII 文本文件,在 Intel HEX 文件中,每一行是一个 HEX 记录,由十六进制数组成的机器码或者数据常量。Intel HEX 文件经常被用于将程序或数据传输存储到 ROM、EPROM,大多数编程器和模拟器使用Intel HEX文件。 2.1
[单片机]
STM32_Touch 总结
移植了奋斗的触摸屏程序,有一些地方还是没有搞懂,这个先把已经做好的记录下来。 首先是触摸屏校准值,这个在后面有专门的校准函数,但是上电采用已经有的校准值进行操作。 C语言: Codee#18707 /*================================================================== * Function : Touch_CalibrationValueAssignment * Description : 触摸屏校准系数 赋初值 * Input Para : None * Output Para : void * Return Value : None ====
[单片机]
05-S3C2440学习之内核(移植)linux3.4.2移植(3)之支持DM9000C网卡及修改支持串口2
之前我们裁剪并移植好了linux3.4.2内核 http://blog.csdn.net/fengyuwuzu0519/article/details/70162666 也学习过 移植DM9000C网卡驱动程序到linux2.2.26内核上http://blog.csdn.net/fengyuwuzu0519/article/details/72821567 接下来我们在此基础上,在linux3.4.2中移植DM9000c网卡驱动,使内核可以支持网卡芯片,这样方便使用NFS网络文件系统。 一、移植思路 (1)我们现在移植好的内核中,支持smdk2440单板和mini2440单板。且使用mini2440机器id的时候
[单片机]
求一种STM32单片机玩转TFTLCD彩屏设计方案
一、功能简介 本项目使用Proteus8.12仿真STM32单片机控制器,使用ST7735R彩屏模块等。 主要功能如下: (1)汉字字符显示; (2)2D图形显示; (3)图片显示; 二、软件设计 //显示界面1--汉字字符显示 void _show_demo1(void) { FRONT_COLOR=WHITE; LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,12, Hai XiaoYi ); FRONT_COLOR=RED; LCD_ShowString(10,30,tftlcd_data.width,tftlcd_data.height,16, Hai
[单片机]