• 第二次作业_RTCSD


    第二次作业要求

    这次作业内容有些多,里面有很多陌生的东西,先梳理一下:

    1.实现代码管理:

    将例程项目Fork到自己的repository,同时在本地电脑安装git工具,创建云端本地的文件同步。

    2.安装仿真软件:

    安装好QEMU来模拟stm32f4评估板的运行,实现Demo1的仿真运行,(以此调高调试速度、节约调试成本)。

    3.学习和实现FreeRTOS多任务同步和通信:

    学习Demo1的闪灯例程,以此熟悉FreeRTOS的API接口和使用、熟悉main.c的代码结构;

    编程实现如下要求:

    • 创建三个任务:Sender_Task,Receiver_Task, Monitor_Task
    • Sender_Task的任务执行周期为2ms,Receiver_Task的任务执行周期为1000ms, Monitor_Task的任务执行周期为10000ms。
    • Sender_Task在每个执行周期向Receiver_Task发送一个32位无符号整数,第一次发送1,然后依次发送2,3,4......,发送完10000后再从1开始发送。同时对发送的数据进行计算累加计算并保存当前累加结果。
    • Receiver_Task对接收到的数据进行和Sender_Task同样的累加计算并保存当前累加结果。
    • Monitor_Task在每个执行周期检查Sender_Task发送的每个数据是否都被Receiver_Task正确的接收和处理,请自行设计一种检查机制并实现。
    • 可利用STM32F429I Discovery开发板的相关硬件(LED/LCD/串口)来输出相关状态信息。
    • 使用FreeRTOS的任务间通信和同步API完成上述功能。

    作业过程:)

    1.安装QEMU、编译Demo1、运行仿真。

    https://github.com/wangsanhust/STM32F429_Discovery_FreeRTOS_9

    期间:

    直接向系统PATH变量文件里写入qemu路径:

    sudo vim /etc/profile

    最后一行添加如下内容保存,注销再登录即可,注意,我的qemu文件夹在~/RTCSD2017/work/路径下。

    export PATH=~/RTCSD2017/work/qemu/2.8.0-201612271623-dev/bin/:$PATH

    make后,运行qemu.sh,成功启动QEMU的GUI,红灯闪两次路灯闪一次的循环闪烁。

    2.学习分析Demo1例程的main.c及涉及的RTOS API。

    •分析main.c:

    http://www.cnblogs.com/wangsan-hust/p/7615749.html

    •学习RTOS API:

    FreeRTOS使用指南 链接

    •本例程里用到的函数:

    vTraceEnable(TRC_INIT);      //Trace ???
    
    vTraceEnable(TRC_START);
    
    xTaskCreate(
              ToggleLED1_Task,                 /* Function pointer */
              "Task_LED1",                          /* Task name - for debugging only*/
              configMINIMAL_STACK_SIZE,         /* Stack depth in words */
              (void*) NULL,                     /* Pointer to tasks arguments (parameter) */
              tskIDLE_PRIORITY + 3UL,           /* Task priority*/
              NULL                              /* Task handle */
           );
    
    vTaskStartScheduler();   //开启任务调度
    
    vTaskDelay(1000 / portTICK_RATE_MS);   //延时1000ms

    3.编程作业(主体)。

    1.xTaskCreate()创建三个任务:Sender_Task,Receiver_Task, Monitor_Task ,发送、接受、监视(LED指示)优先级分别为4、3、2。

    2.ToggleSender_Task()等创建三个任务的触发函数,分别用vTaskDelay()延时2ms、1000ms、10000ms。

    3.队列(FIFO)实现任务间通信,相关API:

    #include "queue.h"   //包含必须头文件

    xQueueHandle NumQueue;   //全局创建队列句柄为 NumQueue

    NumQueue = xQueueCreate( 1000 , 4);   //1000个项目数,每个项目4个字节

    xQueueSend(NumQueue,&SecdNum,0);      //队列名,被发送数据的指针,队列满了,等待队列有空的最大时间

    xQueueReceive(NumQueue,&ReceiveNum,0);   //队列名,接收数据的指针,队列空了,等待队列有数据的最大时间

    4.监测机制:创建两个全局变量(可以通过使用计数型信号量改进),S1记录Sender_Task发送的数据次数,R2记录Receiver_Task接收的数据次数,Monitor_Task中对S1和R2进行比较,相等,红灯关,不相等,红灯亮,比较后S1、R2清零(初步思路,可优化)。绿灯闪烁denote正在接收。

    代码链接:https://github.com/wangsanhust/STM32F429_Discovery_FreeRTOS_9/blob/Work2/Projects/Demo1/main.c

    运行结果:

         

    绿灯闪烁,表示接收正常;

    红灯长亮,监测机制的逻辑不正确,有待优化。

    4.上传到Github

    在我的项目STM32F429_Discovery_FreeRTOS_9 下,branch一个测试版本分支:Work2

    链接:https://github.com/wangsanhust/STM32F429_Discovery_FreeRTOS_9/tree/Work2

  • 相关阅读:
    [NodeJS] Node.js 编码转换
    [SublimeText] 如何创建工程
    浏览器 user-agent 字符串的故事
    [Ubuntu] geoip-bin 程序包
    在 Ubuntu 中安装 MySQL 指南
    在 Ubuntu 13.10 安装 PyCharm 3.0.1 & Oracle JDK
    [Command] lrzsz
    [Linux] 如何修改 Linux 主机名
    如何在 Ubuntu 中安装 Node.js
    [Linux] 修改用户名密码
  • 原文地址:https://www.cnblogs.com/wangsan-hust/p/7615576.html
Copyright © 2020-2023  润新知