STM32-F0/F1/F2

用到的资源是:
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》这个文件夹里面,具体在哪里呢???

在这里“...\ucos\App\”这个路径下,看到没“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("\r\n system init OK! enter os...\r\n");

 

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("\r\n start task\r\n");

 

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);

 

};

}


六、编译改错

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



总结:

1、ucosii这个操作系统移植起来还是比较简单的,主要就是这个汇编文件的移植,对应不同的平台用相应平台的代码。
2、如果懒得修改什么的,上官网下载对应的测试工程也是可以的
3、可裁剪性,这个功能非常好,根据不同的任务和需求裁剪自己需要的即可
4、小小的献丑,高手莫见怪了
5、附件是战舰开发板的测试工程,希望能帮到新手
6、也欢迎各位高手、大神拍砖指导,大家学习学习,共同进步


 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32 F1-F2-F4 比较.pdf STM32各系列比较: F1-F2-F4STM32 – 领先的Cortex-M 产品家族 闪存容量 (字节) 1024K STM32F407VG STM32F417VG STM32F407ZG STM32F417ZG STM32F407IG STM32F417IG STM32F405RG STM32F415RG STM32F405VG STM32F415VG STM32F405ZG STM32F415ZG STM32F207VG STM32F217VG STM32F207ZG STM32F217ZG STM32F207IG STM32F217IG STM32F205RG STM32F215RG STM32F205VG STM32F215VG STM32F205ZG STM32F215ZG STM32F101RG STM32F103RG STM32F101VG STM32F103VG STM32F101ZG STM32F103ZG 768K STM32F205RF STM32F205VF STM32F207VF STM32F205ZF STM32F207ZF STM32F207IF STM32F101RF STM32F103RF STM32F101VF STM32F103VF STM32F101ZF STM32F103ZF 512K STM32F407VE STM32F417VE STM32F407ZE STM32F417ZE STM32F407IE STM32F417IE STM32F207VE STM32F217VE STM32F207ZE STM32F217ZE STM32F207IE STM32F217IE STM32F205RE STM32F215RE STM32F205VE STM32F215VE STM32F205ZE STM32F215ZE STM32F101RE STM32F101VE STM32F101ZE STM32F100RE STM32F103RE STM32F100VE STM32F103VE STM32F100ZE STM32F103VE 384K STM32F101RD STM32F101VD STM32F101ZD STM32F100RD STM32F103RD STM32F100VD STM32F103VD STM32F100ZD STM32F103ZD 256K STM32F205RC STM32F205VC STM32F207VC STM32F205ZC STM32F207ZC STM32F207IC STM32F105RC STM32F105VC STM32F101RC STM32F107RC STM32F101VC STM32F107VC STM32F101ZC STM32F100RC STM32F103RC STM32F100VC STM32F103VC STM32F100ZC STM32F103ZC 128K STM32F205RB STM32F205VB STM32L151CB STM32L152CB STM32L151RB STM32L152RB STM32L15VB STM32L152VB STM32F105R8 STM32F105VB STM32F103TB STM32F101CB STM32F103CB STM32F101RB STM32F103RB STM32F101VB STM32F107VB STM32F101TB STM32F100CC STM32F102CB STM32F100RB STM32F102RB STM32F100VB STM32F103VB 64K STM32L151C8 STM32L152C8 STM32L151R8 STM32L152R8 STM32L15V8 STM32L152V8 STM32F105R8 STM32F105V8 STM32F103T8 STM32F101C8 STM32F103C8 STM32F101R8 STM32F103R8 STM32F101V8 STM32F103V8 STM32F101T8 STM32F100C8 STM32F102C8 STM32F100R8 STM32F102R8 STM32F100V8 STM32L151C6 STM32L152C6 STM32L151R6 STM32L152R6 32K STM32F103T6 STM32F101C6 STM32F103C6 STM32F101R6 STM32F103R6 STM32F101T6 STM32F100C6 STM32F102C6 STM32F100R6 STM32F102R6 16K STM32F103T
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值