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.h和os_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文件。覆盖project文件夹app文件夹下的os_cfg.h文件就可以,不需进行更改,文件内容在此就不列出。

分组port下包括四个文件os_cpu.h、os_cpu_a.asm、os_cpu_c.c和os_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

}

 

时间: 2024-08-03 19:57:30

STM32W108无线传感器网络嵌入式uCOS-II的移植及实时环境监測的相关文章

STM32W108无线传感器网络节点自组织与移动智能体导航技术

使用STM32W108无线开发板及节点完成大规模网络的自组建,网络模型选择树型,网络组建完成之后,使用基于接收信号强度指示RSSI(ReceivedSignal Strength Indication)的N次三边质心加权定位法进行节点定位及智能车导航. 节点自组织及移动智能体导航实际场景 程序设计与实现 基于SimpleMac协议栈sample实例及第15章给出的N次三边质心加权定位算法程序,进行本章程序的设计,对于本章使用的N次三边质心加权定位算法及三边质心定位算法的实现在此就不再说明,主要给

STM32W108无线传感器网络节点定位技术

使用STM32W108无线节点完成基于接收信号强度指示(RSSI:Received SignalStrength Indication)的N次三边质心加权定位,对移动中的节点实时进行定位,并将定位结果发送到汇集中心.图15.1为定位实验的实际场景,所有实验在室内完成,共使用9个节点,1个移动节点,8个信标节点. 图15.1. 定位实际场景 基于第10章介绍的SimpleMac协议栈,对程序进行删减更改,下面给出更改部分代码: 文件solar-system.c相关内容: 函数processRxPa

STM32W108无线传感器网络多传感器环境参数监测实例

本实例基于STM32W108的SimpleMac协议栈,利用无线节点完成对温度.湿度.超声波.烟雾.声音.光敏等传感器的控制及数据采集,并实时将数据发送到STM32W108开发板,完成传感器数据的汇集,并通过串口传送给PC机. 13.4传感器数据采集程序设计与实现 下面将根据不同的传感器分别进行传感器数据采集程序的设计说明,最后给出数据包的发送.接收及主函数部分的详细内容. 13.4.1 温度传感器 temperature.h文件内容: #ifndef  __TEMPERATURE_H__ #d

无线传感器网络(WSN)在各个领域的应用分析

科技发展的脚步越来越快,人类已经置身于信息时代.而作为信息获取最重要和最基本的技术--传感器技术,也得到了极大的发展.传感器信息获取技术已 经从过去的单一化渐渐向集成化.微型化和网络化方向发展,并将会带来一场信息革命. 传感器节点可以连续不断地进行数据采集.事件检测.事件标识.位置监测和节点控制,传感器节点的这些特性和无线连接方式使得无线传感器网络的应用前景非常广阔,几乎涉及到社会经济活动中的各个领域. (1)军事领域的应用 在军事领域,由于WSN具有密集型.随机分布的特点,使其非常适合应用于恶

无线传感器网络

Technorati Tags: ZigBee技术 无线传感器网络        时代进步,技术推陈出新,而作为信息获取最重要和最基本的技术-传感器技术,也得到了极大的发展.传感器信息获取技术已经从过去的单一化渐渐向集成化.微型化和网络化方向发展,将会带来一场信息革命. 具有感知能力.计算能力和通信能力的无线传感器网络WSN,综合了传感器技术.嵌人式计算技术.分布式信息处理技术和通信技术,能够协作地实时监测.感知和采集网络分布区域内的各种环境或监测对象的信息,并对这些信息进行处理,获得详尽而准确

向嵌入式linux开发板移植openSSH

向嵌入式linux开发板移植openSSH 晚上没事干,想着能不能把高大上的openSSH移植到我现在开发的嵌入式linux开发板上,前不久刚弄出来dropbear,但遇到一些小问题,一会说,所以把openSSH搞上去还是可以的.开发板端为服务器端,由宿主机客户端访问. 2016-8-16 背景 开发板:freescale i.mx6q 宿主机操作系统:ubuntu 14.04 开发板操作系统:linux 3.0.35 基本情况 使用dropbear后,ssh算是在板子上成功跑起来了,参见我另一

无线传感器网络操作系统TinyOS

TinyOS是一款自由和开源的基于元件(component-based)的操作系统和平台,它主要针对无线传感器网络(WSN, wireless sensor network).TinyOS是用nesC程序编写的嵌入式操作系统,其作为一系列合作项目的结果. 它的首先出现是做为UC Berkeley和Intel Research合作实验室的杰作,用来嵌入智能微塵当中,之后慢慢演变成一个国际合作项目,即TinyOS联盟. TinyOS应用程序是用nesC编写,它是C programming langu

嵌入式 Linux开发Kernel移植(二)——kernel内核配置和编译

嵌入式 Linux开发Kernel移植(二)--kernel内核配置和编译 本文选择linux 2.6.35.7版本kernel进行实践. 一.linux kernel源码目录分析 Kbuild,Kernel Build,管理内核编译的文件 Makefile,kernel工程的Makefile. arch,体系架构,arch目录下的子目录存放的是不同种类的架构 block,块设备,一般是存储设备,存放的块设备管理的相关代码 crypto,加密相关,存放加密算法实现代码 Documentation

嵌入式 Linux根文件系统移植(二)——根文件系统简介

嵌入式 Linux根文件系统移植(二)--根文件系统简介 根文件系统是内核启动时挂载的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行. 一.嵌入式设备文件系统 在嵌入式Linux应用中,主要的存储设备为 RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tm