打印
[STM32F4]

【转】基于Matlab的STM32软件快速开发

[复制链接]
4863|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本节我们将从UCOSII简介、硬件设计、软件设计和下载验证4部分来分析,主要是从下面4个方面进行讲解:
    1.UCSOII简介
    2.硬件设计
    3.软件设计
    4.下载验证
一、UCOSII简介【摘抄正点原子的】
     UCOSII 的前身是 UCOS,最早出自于 1992  年美国嵌入式系统专家 Jean J.Labrosse  在《嵌入式系统编程》杂志的 5 月和 6 月刊上刊登的**连载,并把 UCOS  的源码发布在该杂志的BBS上。目前最新的版本:UCOSIII 已经出来,但是现在使用最为广泛的还是 UCOSII,本章我们主要针对 UCOSII 进行介绍。在学习本章之前,UOCS 相关的知识比较多,我们实验也知识指点一下大家入门,详细了解建议大家先看看任哲老师的《嵌入式实时操作系统 ucosII 原理及应用》,这本书的 Pdf 我们光盘有,大家可以翻阅一下。同时我们光盘还提供了一个北航老师的 UCOS 简明讲义,大家也可以翻阅一下。
      UCOSII 是一个可以基于 ROM 运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。为了提供最好的移植性能,UCOSII 最大程度上使用 ANSI  C 语言进行开发,并且已经移植到近 40 多种处理器体系上,涵盖了从 8 位到 64 位各种 CPU(包括 DSP)。
     UCOSII 是专门为计算机的嵌入式应用设计的,   绝大部分代码是用 C 语言编写的。CPU硬件相关部分是用汇编语言编写的、总量约 200 行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的 CPU  上。用户只要有标准的 ANSI  的 C 交叉编译器,有汇编器、连接器等软件工具,就可以将 UCOSII 嵌人到开发的产品中。 UCOSII 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,  最小内核可编译至  2KB  。UCOSII 已经移植到了几乎所有知名的 CPU  上。
     UCOSII 构思巧妙。结构简洁精练,可读性强,同时又具备了实时操作系统的全部功能,虽然它只是一个内核,但非常适合初次接触嵌入式实时操作系统的朋友,可以说是麻雀虽小,
五脏俱全。UCOSII(V2.91 版本)体系结构如下图所示:

UCOSII 体系结构图
     注意本章我们使用的是 UCOSII 的最新版本: V2.91 版本,该版本 UCOSII 比早期的UCOSII(如 V2.52)多了很多功能(比如多了软件定时器,支持任务数最大达到 255 个等),而且修正了很多已知 BUG。不过,有两个文件:os_dbg_r.c 和 os_dbg.c,我们没有在上图列出,也不将其加入到我们的工程中,这两个主要用于对 UCOS 内核进行调试支持,比较少用到。
      从上图可以看出,UCOSII 的移植,我们只需要修改:os_cpu.h、os_cpu_a.asm 和 os_cpu.c等三个文件即可,其中:os_cpu.h,进行数据类型的定义,以及处理器相关代码和几个函数原型;os_cpu_a.asm,是移植过程中需要汇编完成的一些函数,主要就是任务切换函数; os_cpu.c,定义一些用户 HOOK 函数。
       图中定时器的作用是为 UCOSII 提供系统时钟节拍,实现任务切换和任务延时等功能。这个时钟节拍由 OS_TICKS_PER_SEC (在 os_cfg.h 中定义)设置,一般我们设置 UCOSII 的系统时钟节拍为 1ms~100ms,具体根据你所用处理器和使用需要来设置。本章,我们利用 STM32的SYSTICK 定时器来提供 UCOSII 时钟节拍。
关于 UCOSII 在 STM32 的详细移植,请参考光盘资料(《UCOSII 在 STM32 的移植详解.pdf》),这里我们就不详细介绍了。
       UCOSII 早期版本只支持 64 个任务,但是从 2.80 版本开始,支持任务数提高到 255 个,不过对我们来说一般 64 个任务都是足够多了,一般很难用到这么多个任务。UCOSII 保留了最高4 个优先级和最低 4 个优先级的总共 8 个任务,用于拓展使用,单实际上, UCOSII 一般只占用了最低 2 个优先级,分别用于空闲任务(倒数第一)和统计任务(倒数第二),所以剩下给我们使用的任务最多可达 255-2=253 个(V2.91)。
UCOS 是怎样实现多任务并发工作的呢?  外部中断相信大家都比较熟悉了。CPU 在执行一段用户代码的时候,如果此时发生了外部中断,那么先进行现场保护,之后转向中断服务程序执行,执行完成后恢复现场,从中断处开始执行原来的用户代码。 Ucos 的原理本质上也是这样的,当一个任务 A 正在执行的时候,如果他释放了 cpu 控制权,先对任务 A 进行现场保护,然后从任务就绪表中查找其他就绪任务去执行,等到任务 A 的等待时间到了,它可能重新获得cpu 控制权,这个时候恢复任务 A 的现场,从而继续执行任务 A,这样看起来就好像两个任务同时执行了。实际上,任何时候,只有一个任务可以获得 cpu 控制权。这个过程很负责,场景也多样,这里只是举个简单的例子说明。
所谓的任务,其实就是一个死循环函数,该函数实现一定的功能,一个工程可以有很多这样的任务(最多 255 个),UCOSII 对这些任务进行调度管理,让这些任务可以并发工作(注意不是同时工作!!,并发只是各任务轮流占用 CPU,而不是同时占用,任何时候还是只有 1个任务能够占用 CPU),这就是 UCOSII 最基本的功能。Ucos 任务的一般格式为:
void MyTask (void *pdata)
{
任务准备工作…
While(1)//死循环
{         
任务 MyTask 实体代码;
OSTimeDlyHMSM(x,x,x,x);//调用任务延时函数,释放 cpu 控制权,
}
}
   


评论
blade55 2019-8-7 13:17 回复TA
太快了,看不清楚matlab! 
沙发
被大学上了四年|  楼主 | 2016-9-10 22:23 | 只看该作者
二、硬件原理图
     硬件原理图很简单,在本序列的跑马灯里面就有。这里就不作过多的介绍。
     下面主要看的是STM32F4探索套件的LED灯部分的原理图。

      从上面的原理可以看见,很简单,只要给一个高电平LED就会亮,这就不多讲了。STM32F4探索套件就是两个用 户LED灯,LED3和LED4一个位绿色,一个为红色。
三、软件编写
    在写程序的时候,首先按一下步骤检查是否已经完备。
    1.确保JP3和CN4跳线是连接的【Discovery模式】。
    2.通过Min USB把开发板和电脑连接,USB供电。
    3.通过ST-Link/V2来下载程序。
    4.检查USB通讯的LED1灯是否亮,电源灯LED2是否亮(3.3v)
以上正常就可以进行下面的工作了。
/***************************************
* 函数描述:主函数
* 输入参数:No
* 返 回 值:No
* 说    明:
* 修改记录:
****************************************/        
int main(void)                                                                        
{
        OS_CPU_SysTickInit();                                                //设置SysTick,并允许中断。
        bsp_init();
        OSInit();  
        OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
        OSStart();                                                                        //开始任务调度
        return(0);
}
/***************************************
* 函数描述:开始任务
* 输入参数:*pdata
* 返 回 值:No
* 说    明:
* 修改记录:
****************************************/        
void start_task(void *pdata)
{
  OS_CPU_SR cpu_sr=0;
        pdata = pdata;
        OSStatInit();                                                                    //初始化统计任务.这里会延时1秒钟左右
         OS_ENTER_CRITICAL();                                                //进入临界区(无法被中断打断)   
         OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);                                                   
         OSTaskCreate(led2_task,(void *)0,(OS_STK*)&LED2_TASK_STK[LED2_STK_SIZE-1],LED2_TASK_PRIO);        
        OSTaskSuspend(START_TASK_PRIO);                                //挂起起始任务.
        OS_EXIT_CRITICAL();                                                        //退出临界区(可以被中断打断)
}
四、下载验证
可以看到红绿LED灯交替闪烁。
                                                           



使用特权

评论回复
板凳
aozima| | 2016-9-10 23:27 | 只看该作者
Matlab在哪

使用特权

评论回复
地板
dongshan| | 2016-9-11 12:23 | 只看该作者
挂羊头,卖狗肉。。。

使用特权

评论回复
5
zhouyanxin| | 2016-9-11 16:12 | 只看该作者
封id

使用特权

评论回复
6
wt.liu| | 2016-9-11 19:47 | 只看该作者
Matlab呢?

使用特权

评论回复
7
banxiafeixia| | 2018-1-22 08:45 | 只看该作者
片浏览的?

使用特权

评论回复
8
mintspring| | 2018-1-26 16:20 | 只看该作者
?????

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

97

帖子

0

粉丝