首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于Cortex—M3的自动气象站设计2

基于Cortex—M3的自动气象站设计2

数据采集各模块的关键技术指标见表1,其中温湿度、气压使用平均算法,风速使用滑动平均算法。


    平均算法:测量一分钟,每分钟取样6次,去掉一个最大值和最小值,剩下4个值取算术平均。
    滑动平均算法:当采集速率每秒一次(t=1),平均期间T=3s,连续测量120s,代入下面公式计算:
   
    式中:n个样本值的平均值,:n-1个样本值的平均值,Yn:第n个样本值,t:采样时间,T:平均期间(s)。

3 软件设计
3.1 基于Cortex—M3的μc/os—II移植
    μc/os—II是一种典型的具有可剥夺型内核的基于任务优先级调度的实时操作系统,可同时管理多达64个任务,由于Cortex—M3不支持32位的ARM指令集,而只支持Thumb-2指令集,这种不向后兼容的方式使Cortex—M3之前平台使用的ARM汇编语言程序都不能直接移植到Cort ex—M3上,笔者从μc/os—II和Cortex—M3的内核结构研究着手,对μc/os—II内核中INCLUDES.H、OS_CFG.H、OS_CPU.H、OS_CPU_ C.C、OS_CPU_A.ASM五个与应用程序和处理器相关的文件进行修改,在INCLUDES.H中增加了与STM32处理器相关的外设寄存器定义和内存映射的头文件,在OS_CFG.H中完成对μc/os—II内核构造部分的配置工作,在OS_CPU.H中完成与编译器相关数据类型的定义、任务堆栈数据类型的定义,以及任务堆栈方向的设定工作,在OS_CPU_C.C中根据Cortex—M3内核结构完成系统任务堆栈结构设计,由于在C环境下无法对Cortex—M3的寄存器进行操作,所以需要在OS_CPU_A.ASM汇编环境中完成对临界区函数、上下任务切换函数以及中断服务子程序中的任务切换函数的设计工作,在完成以上修改后还需在c环境下增加系统时钟配置和中断函数为μc/os—II提供一个周期性信号源,在STM32中系统时钟是由SysTick定时器来提供的。
3.2 μc/os—II任务设计
   
在μc/os—II架构下整体设计中需要建立7个任务,如图2所示,由于统计任务主要作用是计算当前CPU的利用率,需要消耗相当的STM32内部资源,所以为节约系统资源在这里需要把系统配置OS_TASK_STAT_EN设置为0,禁止使用统计任务,空闲任务是必须的,在没有其它任务进入就绪状态时投入运行,当系统开始运行前自动建立,优先级自动配置为最低。由于系统要求在开始多任务调度前必须新建一个任务,所以我们建立了一个开始任务,开始仟务作用就是新建另外5个任务,包括:温湿度采集任务、气压数据采集任务、风速采集任务、数据存储任务、数据发送任务,完成这5个任务建立后开始任务就会自己挂起。完成对任务设计后还需要对任务的优先级进行设置,空闲任务优先级设置为最低,风速采集任务频率最高为1s/次,所以优先级应设置为最高,温湿度和气压采集任务频率相同为10s/次,设置优先级应低于风速采集任务,数据存储和发送任务应该都在前面几个数据采集任务完成后,所以设置优先级应该更低一些,开始任务由于在新建任务后被挂起并不参与任务调度,所以优先级可以设置为次于空闲任务的最低级。


3.3 系统整体调试
   
在主函数中需要进行初始化工作,主要完成STM32时钟系统和μc/os—II时钟系统配置,初始化操作系统后新建开始任务TaskStart后操作系统开始运行,在系统刚开始进行任务调度时由于只有空闲任务和开始任务参与任务调度,开始任务优先级最高所以执行开始任务,在开始任务中又新建气压测量任务(TaskPre)、温湿度测量任务(TaskTem)、风速测量任务(TaskV)、数据存储任务(TaskFlash)、数据发送任务(TaskSim),完成任务新建后开始任务被挂起进入休眠状态,不再参与任务调度,根据事先设计好的优先级系统总是执行优先级最高的任务,风速测量任务优先级最高,挂起时间一到总能得到处理器的使用权,当测量完毕后任务自动挂起不参与任务调度,类似的情况,温湿度测量、气压测量完成各自测量数据并完成数据处理器后也自动挂起,并把标志为置1表示测量工作完成,数据存储任务和数据发送任务根据判断标志位决定是否进行数据存储和数据发送工作,其主函数和开始任务主要代码如下:
返回列表