zoukankan      html  css  js  c++  java
  • 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》这个文件夹里面,具体在哪里呢???

    在这里“...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("  system init OK! enter os... ");

     

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

     

    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、也欢迎各位高手、大神拍砖指导,大家学习学习,共同进步





  • 相关阅读:
    实例属性 类属性 实例域 类域
    研究数据集
    static 静态域 类域 静态方法 工厂方法 he use of the static keyword to create fields and methods that belong to the class, rather than to an instance of the class 非访问修饰符
    accessor mothod mutator mothod 更改器方法 访问器方法 类的方法可以访问类的任何一个对象的私有域!
    上钻 下钻 切片 转轴 降采样
    识别会话
    Performance Tuning Using Linux Process Management Commands
    Secure Hash Algorithm 3
    grouped differently across partitions
    spark 划分stage Wide vs Narrow Dependencies 窄依赖 宽依赖 解析 作业 job stage 阶段 RDD有向无环图拆分 任务 Task 网络传输和计算开销 任务集 taskset
  • 原文地址:https://www.cnblogs.com/liangxiaofeng/p/4843270.html
Copyright © 2011-2022 走看看