历史上的今天
返回首页

历史上的今天

今天是:2025年04月07日(星期一)

正在发生

2020年04月07日 | ucosii移植到STM32-F0/F1/F2

2020-04-07 来源:eefocus

用到的资源是:
A、ST公司提供:STM32F10x开发标准库V3.5
B、实验平台:战舰开发板V2.1
C、编译软件:MDK3.8
D、编辑软件:Source Insight_V3.5
E、RTOS:ucosii_V2.92
F、实验现象设计:红灯亮灭各800ms,绿色灯亮灭各300ms

一、获取源码
     这个可以百度下载,我们论坛也是有很多的源码工程的,官网可以在这里下载http://micrium.com/downloadcenter/micrium-source-code/
     我移植的是2.92版本


二、获取ucosii源码文件
     解压下载下来的压缩包,看到如下的文件目录结构

红色框框就是ucosii源码文件夹了,双击打开

双击红色框框的文件夹进去,看到里面的内容,有没小兴奋一下下呢???

没错,这里就是ucosii源码的所在地了

A、在《Ports》文件夹里面的就是ucos与CPU打交道的代码了“看文件夹英文名字就知道了”
B、在《Source》文件夹里面的就是ucos的核心代码了
C、至于os_cfg.h这个文件是干啥的,双击打开一看开头的说明,哦。。。原来是裁剪用的,呵呵,比如打开什么功能,关闭什么功能用的等等,具体请看后面的注释

三、新建测试工程

这里新建立一个工程,比如ucosii什么的(自己建立好就行),我就在工程里面建立了三个文件夹来存放ucosii的代码。根据自己的喜好建立就好,呵呵

1、将上面提到的《Source》文件夹里面的文件拷贝到《CORE》文件夹里面,这里面的文件是ucos的核心代码,不用修改。
2、将上面提到的《Ports》文件夹里面的文件拷贝到《PORTS》文件夹里面,这里就是移植的核心部分了
3、返回上一级文件夹,将“os_cfg.h”这个文件拷贝到《CONFIG》这个文件夹里面,这里还要添加一个文件,这个文件不在《uCOS-II》这个文件夹里面,具体在哪里呢???

在这里“...ucosApp”这个路径下,看到没“includes.h”这个文件,拷贝到《CONFIG》这个文件夹里面。


4、在MDK(当然喜欢用其他编辑器的同志也是可以的)添加文件,如下图所示,具体视个人喜好建立目录结构了,我建立了《UCOSII_CORE》、《UCOSII_PORTS》、《UCOSII_CONFIG》这三个文件夹存放ucos的相关代码。


哈哈。。。接下来就是爽歪歪的环节了。。。


四、修改代码

1、地球人都知道的,人有心跳,操作系统也不例外,双击打开“os_cfg.h”这个文件,找到“OS_TICKS_PER_SEC”这个宏定义,原文的是1000即1秒钟了(看后面的注释),这里我将它改为200也就是5ms的节拍,至于这个5ms怎么得来的,根据代码算一下就出来了


2、找到“OS_MAX_TASKS”这个宏定义,看这个名字就知道干啥的吧,没错,就是最大的任务数,这里我定义为5即最多5个任务,具体数量自己掂量


3、这里我们关闭一部分ucos的功能,例如OS_DEBUG_EN、OS_EVENT_MULTI_EN、OS_EVENT_NAME_EN等等,具体的功能请看定义后面的注释或者本工程代码。

4、前面说到了操作系统的心跳,这里可以用多种方式提供,在CM3里面有个嘀嗒定时器,这个家伙就可以提供了,所以这里我们用它来做操作系统的心跳。修改本工程sys.h中的宏定义_SYSTEM_SUPPORT_ROTS将它的值改为1【如果用到原子哥的SYSTEM文件夹的话,直接将SYSTEM_SUPPORT_UCOS宏定义修改为1即可】。

5、打开“os_cpu_a.asm”文件,修改相关的汇编

A、首先看到的是前面的函数入口代码


修改成上图这个样子,呵呵

B、接着伪定义寄存器和相关的数值


具体寄存器地址和相关的数值可以参考《Cortex-M3权威指南(中文).pdf》第284~286页之间的内容


C、接着下面的改成下图样子



D、将文件拖到最后,那里的程序标好字符就要参考文件开头的定义进行改变了,具体参考代码

6、打开“os_cpu.h”文件,这里主要就是修改相关的数据类型的,视不同平台而修改,详细文件内容见工程。



7、打开“includes.h”这个文件,这里主要就是集合了需要的头文件,删除或者注释一些没用到的,增加里面没有但是需要用到的。详细见工程文件。

A、找到下图处,将其全部注释掉,或者删掉也行,因为这些库这里没用到,但是你的工程有用到的话就保留吧,V2.86之前的版本好像定义了这些文件



B、找到这里,将这个库头文件修改一下



五、main函数编辑


1、在main函数中增加以下内容,注意了,优先级的数值越大就越低,0是最高的优先级,就这样

/* 起始任务相关设置 */

//任务优先级

#define Start_Task_PRIO          10  //优先级最低

 

//任务堆栈大小

#define Start_STK_Size            64

 

//任务堆栈空间大小

OS_STK Start_Task_STK[Start_STK_Size];

 

//任务接口函数

void start_task(void *pdata);

 

 

/* LED0任务0 */

//任务优先级

#define LED0_Task_PRIO          7  //优先级最低

 

//任务堆栈大小

#define LED0_STK_Size            64

 

//任务堆栈空间大小

OS_STK LED0_Task_STK[LED0_STK_Size];

 

//任务接口函数

void LED0_task(void *pdata);

 

 

/* LED1任务1 */

//任务优先级

#define LED1_Task_PRIO          6  //优先级最低

 

//任务堆栈大小

#define LED1_STK_Size            64

 

//任务堆栈空间大小

OS_STK LED1_Task_STK[LED1_STK_Size];

 

//任务接口函数

void LED1_task(void *pdata);

 

上面的主要是设置任务的堆栈大小和中断的优先级了


2、创建任务

int main(void)

{

OS_Heart_Init();  //初始化ucos心跳

MY_NVIC_PriorityGroup_Config(NVIC_PriorityGroup_2);  //初始化中断优先级

USART1_Init(9600);

LED_Init();  //初始化LED硬件接口

 

printf("rn system init OK! enter os...rn");

 

OSInit();  //初始化ucos

OSTaskCreate(start_task, (void *)0, (OS_STK *)&Start_Task_STK[Start_STK_Size-1], Start_Task_PRIO);  //创建起始任务

OSStart();  //ucos启动

}

/******************************************************************************

* Function Name --> 开始任务

* Description   --> none

* Input         --> *pdata: 任务指针

* Output        --> none

* Reaturn       --> none 

******************************************************************************/

void start_task(void * pdata)

{

OS_CPU_SR cpu_sr=0;

 

pdata = pdata;

OS_ENTER_CRITICAL();  //进入临界区,无法被中断打断


printf("rn start taskrn");


OSTaskCreate(LED0_task, (void *)0, (OS_STK *)&LED0_Task_STK[LED0_STK_Size-1], LED0_Task_PRIO);

OSTaskCreate(LED1_task, (void *)0, (OS_STK *)&LED1_Task_STK[LED1_STK_Size-1], LED1_Task_PRIO);

OSTaskSuspend(Start_Task_PRIO);  //挂起起始任务

OS_EXIT_CRITICAL();  //退出临界区,可以被中断打断

}

/******************************************************************************

* Function Name --> 任务0

* Description   --> none

* Input         --> *pdata: 任务指针

* Output        --> none

* Reaturn       --> none 

******************************************************************************/

void LED0_task(void * pdata)

{

while(1)

{

LED0 = 0;

delay_ms(800);

LED0 = 1;

delay_ms(800);

};

}

/******************************************************************************

* Function Name --> 任务1

* Description   --> none

* Input         --> *pdata: 任务指针

* Output        --> none

* Reaturn       --> none 

******************************************************************************/

void LED1_task(void * pdata)

{

while(1)

{

LED1 = 0;

delay_ms(300);

LED1 = 1;

delay_ms(300);

 

};

}


六、编译改错

上面工作准备好之后,这时就编译改错即可。直到没有错误和警告,大功告成,哈哈。。。下载到板子上,看到两个灯在不停的闪烁了。一个闪的快一点,一个闪的慢一点

推荐阅读

史海拾趣

CSB公司的发展小趣事

CSB公司深知人才是企业发展的核心竞争力。因此,公司一直注重人才培养和团队建设。通过建立完善的培训体系、提供丰富的职业发展机会、营造积极向上的企业文化等方式,CSB公司吸引了一批批优秀的人才加入。这些人才为公司的发展注入了新的活力,推动了公司在技术、市场、管理等方面的不断进步。

振华新云(CEC)公司的发展小趣事

背景:1966年,在贵州凯里白午山区,国营新云器材厂(后更名为振华新云)正式成立,标志着公司的诞生。

内容:成立初期,公司面临着技术落后、设备陈旧等困难。然而,在老一辈员工的艰苦奋斗下,公司逐渐摸索出适合自身的发展道路。通过引进新技术、优化生产流程,不断提高产品质量和生产效率。

成果:经过几年的努力,振华新云逐渐在电子元器件行业崭露头角,为后续的快速发展奠定了坚实基础。

浙江凡华(FANHAR)公司的发展小趣事

背景:为了进一步扩大市场份额和提高品牌影响力,振华新云积极开展市场拓展和国际合作。

内容:公司积极参加国内外电子展会和论坛等活动,加强与国内外客户的沟通和交流。同时,积极寻求与国际先进企业的合作机会,共同开展技术研发和市场推广等活动。

成果:通过市场拓展和国际合作,振华新云的产品逐渐走向世界舞台,赢得了广大客户的信赖和好评。同时,公司也积累了宝贵的国际化经验和资源,为未来的国际化发展奠定了坚实基础。

Adaptive Networks Inc公司的发展小趣事

背景:2004年,为了适应国家经济发展和产业布局调整的需要,振华新云面临从凯里白午山区调迁至贵阳市新添高新技术开发区的挑战。

内容:在调迁过程中,公司克服了种种困难,如设备搬迁、员工安置、生产线重建等。通过精心组织和周密安排,确保了调迁工作的顺利进行。

成果:调迁完成后,振华新云在贵阳市新添高新技术开发区迎来了新的发展机遇,为公司后续的快速发展提供了有力保障。

AZ Displays公司的发展小趣事

随着公司规模的扩大和市场份额的提升,AZ Displays开始实施全球化战略。公司在全球范围内建立销售网络和分支机构,积极开拓国际市场。通过与国际知名企业的合作,AZ Displays成功将产品打入国际市场,进一步提升了公司的品牌影响力和市场竞争力。

Ampex Data Systems Group公司的发展小趣事

面对日益激烈的市场竞争和不断变化的客户需求,AZ Displays始终保持着创新的活力。公司不断投入研发资源,推出具有创新性和领先性的产品。同时,AZ Displays还积极关注行业动态和新兴技术,不断调整和优化产品策略,以确保公司在市场中的领先地位。

这些故事展示了AZ Displays在电子行业中的发展历程和成就,体现了公司不断创新、追求卓越的精神。未来,随着科技的不断进步和市场需求的不断变化,AZ Displays将继续保持创新活力,为客户提供更优质的产品和服务。

问答坊 | AI 解惑

模拟厂商如何应对手机产品提出的挑战?

整个手机产业目前的状况似乎已经陷入一种以价格竞争的阶段,有点像电视机市场。手机好像已经不属于我们印象中的高科技产品,几百块钱的手机就已经具备很丰富的功能,如音乐、拍照、摄像、手写输入、超大的触摸屏,真令人不可思议。用Intersil公司中 ...…

查看全部问答>

rf2401资料

本帖最后由 paulhyde 于 2014-9-15 08:59 编辑 rf2401资料  …

查看全部问答>

会PID指点下我吧

这用的SIMULINK里S-function模板,目的是想看一下自己写的PID和搭建出来的PID差别,结果差别还真挺大的,求指点 function sys=mdlOutputs(t,x,u,kp,ki,kd,lastu,lasterror,sumerror) error=u-lastu; %u是出入,lastu是上次输入 sumerror=sumerro ...…

查看全部问答>

新人求教wince基础问题

各位高手,小弟刚接触wince,有两个基础问题想请教一下,望指教 1.一个线程循环执行,需要100毫秒执行一次,但是循环体内的代码执行时间不定,因此不能用 while(1) {     Sleep(100); . . . . . } 这样循环周期就等于100ms加上 ...…

查看全部问答>

EVC4.0里怎么进行内存泄露检查?

EVC4.0里怎么进行内存泄露检查?基于PPC2003。   快崩溃了,请高手指教!在线等………

查看全部问答>

有没有人用过0.5PF以下小电容

来自:电子工程师技术交流(12425841)…

查看全部问答>

祝贺传感器子论坛成立!

非常感谢管理员SOSO,传感器子论坛终于成立了。 以后大家 有关传感器的问题、话题可以集中在此讨论了。…

查看全部问答>

multisim的问题

请大家介绍一些multisim元件库里的大功率管,multisim可以测电流波形吗? [ 本帖最后由 maimaikaka1989 于 2011-4-9 22:50 编辑 ]…

查看全部问答>

解答FPGA工程师面试第5 6 题(每日一题)

最近忙了点,一直没有时间上后面的题,今天终于空下来了。学校不放行了,我也没有办法了。哈哈,不过坛子还是要顶起的嘛。 对吧。 好了废话少说了。现在我上出FPGA工程师面试题的第五题、第六题、第七题。。。 希望大家共同学习。。。。。 5、 ...…

查看全部问答>