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”,从文件夹“Micrium\Software\EvalBoards\ST\STM3210B-EVAL\IAR\OS-Probe\”目录下拷贝os_cfg.h文件,覆盖工程目录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更改完成之后,需要对协议栈目录“hal\micro\cortexm3”目录下的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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值