zoukankan      html  css  js  c++  java
  • STM32W108无线传感器网络嵌入式uCOS-II的移植及实时环境监測

    基于STM32W108无线开发板,将ucos-ii v2.86内核移植到其上,并加入用户任务。实现对温湿度、超声波、声音、光敏等传感器的控制及实时数据採集。

    14.1 开发环境说明      

    硬件:STM32W108无线开发板,JLink烧写器。PC机、温湿度传感器、声音传感器、光敏传感器、超声波传感器等。

    软件:IAR Embedded Workbench开发软件,SimpleMac Zigbee协议栈,ucos-ii的内核源代码。

    实验硬件电路传感器接口与第13章中使用的传感器接口同样,具体信息參考13.3节硬件电路设计部分,在此不再反复说明。

     

    相关源文件更改

    文件加入完毕之后,须要对部分文件进行更改。首先更改app分组里面的app_cfg.hos_cfg.h文件。app_cfg.h为用户自己定义參数。如任务堆栈大小,任务的优先级等參数,文件内容例如以下:

    #ifndef   _APP_CFG_H_

    #define   _APP_CFG_H_

     

    //任务优先级

    #define STARTUP_TASK_PRIO                      4

    #define HUMIDITY_PRIO                          6

    #define SOUND_PRIO                             7

    #define PRESS_PRIO                             8

    #define DISTANCE_PRIO                          9

     

    //任务堆栈大小

    #define STARTUP_TASK_STK_SIZE                  80

    #define TASK_STK_SIZE                         128

    #endif

     

    14.3部分对源代码包“Micrium-ARM-uCOS-II-Cortex-M3.exe”进行解压之后会得到文件夹“Micrium”,从文件夹“MicriumSoftwareEvalBoardsSTSTM3210B-EVALIAROS-Probe”文件夹下拷贝os_cfg.h文件。覆盖project文件夹app文件夹下的os_cfg.h文件就可以,不需进行更改,文件内容在此就不列出。

    分组port下包括四个文件os_cpu.hos_cpu_a.asmos_cpu_c.cos_dbg.c,以下分别进行对应的更改。

    对于文件os_cpu.h将第109行语句“void OS_CPU_PendSVHandler(void);”凝视掉,加入语句“voidPendSV_Handler(void);”,然后保存文件。

    文件os_cpu_a.asm中为汇编代码,首先将第41行代码“EXPORT OS_CPU_PendSVHandler”替换为“EXPORTPendSV_Handler”,即将函数PendSV_Handler定义为外部可见。然后将第204行代码“OS_CPU_PendSVHandler”替换为“PendSV_Handler”,完毕函数PendSV_Handler的定义,删除函数OS_CPU_PendSVHandler

    文件os_cpu_a.asm更改完毕之后,须要对协议栈文件夹“halmicrocortexm3”文件夹下的context-switch.s79文件进行更改,由于文件os_cpu_a.asm中对函数PendSV_Handler进行了定义,而文件context-switch.s79中已有此函数定义,须要将context-switch.s79文件里的函数凝视掉。打开文件context-switch.s79,定位到文件的91行,对函数进行凝视。内容例如以下:

    ;         __CODE__

    ;         __THUMB__

    ;         __EXPORT__ PendSV_Handler

    ;         __EXPORT__ halPendSvIsr

    ;PendSV_Handler:

    ;halPendSvIsr:

    ;         LDR  R0, =halPendSvSaveContext

    ;         LDRB R0, [R0]

    ;         CBZ  R0, contextRestore

    ;contextSave:

    ;         MRS  R0, MSP      

    ;        SUB  R0, R0, #0x20   

    ;        MSR  MSP, R0       

    ;         STM  R0, {R4-R11}  

    ;         LDR  R1, =savedMSP

    ;         STR  R0, [R1]      

    ;         WFI

    ;contextRestore:

    ;        LDR   R0, =savedMSP

    ;         LDR  R0, [R0]     

    ;         LDM  R0, {R4-R11}

    ;         ADD  R0, R0, #0x20

    ;         MSR  MSP, R0    

    ;         BX   LR         

     

    文件os_cpu_c.c中的部分函数须要进行更改。更改函数例如以下:

    INT32U   OS_CPU_SysTickClkFreq(){return 6000000;} //新加入函数,CPU时钟频率

     

    //更改方式:将函数OSTaskCreateHook()内容全然凝视

    #if  OS_CPU_HOOKS_EN > 0

    void   OSTaskCreateHook (OS_TCB *ptcb)

    {

       /*

    #if OS_APP_HOOKS_EN > 0

         App_TaskCreateHook(ptcb);

    #else

         (void)ptcb; // Prevent compiler warning

    #endif

       */

    }

    #endif

     

    //更改方式:将函数OSTaskDelHook()内容全然凝视

    #if  OS_CPU_HOOKS_EN > 0

    void  OSTaskDelHook (OS_TCB *ptcb)

    {

      /*

    #if  OS_APP_HOOKS_EN > 0

        App_TaskDelHook(ptcb);

    #else

         (void)ptcb; //Prevent compiler warning

    #endif

       */

    }

    #endif

     

    //更改方式:将函数OSTaskIdleHook  ()内容全然凝视

    #if  OS_CPU_HOOKS_EN > 0 && OS_VERSION >= 251

    void   OSTaskIdleHook (void)

    {

       /*

    #if OS_APP_HOOKS_EN > 0

         App_TaskIdleHook();

    #endif

       */

    }

    #endif

     

    //更改方式:将函数OSTaskStatHook()内容全然凝视

    #if  OS_CPU_HOOKS_EN > 0

    void   OSTaskStatHook (void)

    {

       /*

    #if OS_APP_HOOKS_EN > 0

         App_TaskStatHook();

    #endif

       */

    }

    #endif

     

    //更改方式:将函数OSTaskSwHook  ()内容全然凝视

    #if  (OS_CPU_HOOKS_EN > 0) && (OS_TASK_SW_HOOK_EN > 0)

    void   OSTaskSwHook (void)

    {

       /*

    #if OS_APP_HOOKS_EN > 0

         App_TaskSwHook();

    #endif

       */

    }

    #endif

     

    //更改方式:将函数OSTCBInitHook  ()内容全然凝视

    #if  OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203

    void   OSTCBInitHook (OS_TCB *ptcb)

    {

       /*

    #if OS_APP_HOOKS_EN > 0

         App_TCBInitHook(ptcb);

    #else

         (void)ptcb;  //避免编译警告

    #endif

       */

    }

    #endif

     

    //更改方式:将函数OSTimeTickHook  ()内容全然凝视

    #if (OS_CPU_HOOKS_EN > 0) &&  (OS_TIME_TICK_HOOK_EN > 0)

    void   OSTimeTickHook (void)

    {

    /*  

    #if OS_APP_HOOKS_EN > 0

         App_TimeTickHook();

    #endif

    */

     

    //加入新函数SysTick_Handler(),时钟中断处理函数

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

    功能描写叙述:时钟中断处理函数

    參数:无

    返回值:无

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

    void  SysTick_Handler (void)

    {

        OS_CPU_SR   cpu_sr;

        OS_ENTER_CRITICAL();  //通知uC/OS-II内核ISR已被启动

        OSIntNesting++;

        OS_EXIT_CRITICAL();

        OSTimeTick();  //调用uC/OS-II内核提供的OSTimeTick()函数

        OSIntExit();  //通知uC/OS-II内核我们退出ISR

    }

     

     本文出自《STM32W108嵌入式无线传感器网络》邱铁,夏锋,周玉编著.清华大学出版社,20145

  • 相关阅读:
    ‘内部系统’怎么测试?两年测试的总结与反思
    微信公众号支付 -- 笔记
    数组处理
    String操作
    number 处理
    date 处理
    type检查
    全选全不选,返回字符串长度,汉字计数为2,获取url中的参数 ,函数防抖,函数节流
    关于移动端兼容BUG问题收集及处理
    nginx 1.6.0 配置文件服务器下载
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5146636.html
Copyright © 2011-2022 走看看