基于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
}
|
本文出自《STM32W108嵌入式无线传感器网络》邱铁,夏锋,周玉编著.清华大学出版社,2014年5月
转载于:
基于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
}
|