实时控制软件第二次作业

0. Fork例程到自己的GitHub账号

开发环境搭建

1. QEMU安装

建议使用qemu-system-gnuarmeclipse,该qemu分支对stm32f4有更好的支持,主要面向Eclipse开发环境。

#cd ~/work
#tar xvf gnuarmeclipse-qemu-debian64-2.8.0-201612271623-dev.tgz
#chmod -R -w ./qemu
export PATH=~/work/qemu/2.8.0-201612271623-dev/bin/:$PATH
  • 测试qemu能否正常运行
#qemu-system-gnuarmeclipse --version




显示版本信息为2.8.0,正常。

2. 编译例程

  • 在/Projects/Demo1目录下运行make,生成hello_rtos.elf文件

说明:qemu-system-gnuarmeclipse当前版本不支持STM32F4的浮点,相应的,FreeRTOS使用的portable目录没有使用ARM_CM4F而是使用ARM_CM3。

3. QEMU仿真

在Demo1目录下运行脚本文件:

#./qemu.sh

4. GDB调试

在/Projects/Demo1目录下运行qemu_gdb脚本文件,该文件中添加了--gdb tcp::1234 -S

qemu启动后等待来自gdb的调试指令,打开另外一个终端窗口,运行

#arm-none-eabi-gdb

在gdb界面内运行:

(gdb)target remote localhost:1234
(gdb)continue

5. 编程作业具体要求:

  • 创建三个任务: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.main函数

int main(void)
{
     MsgQueue=xQueueCreate(30000,sizeof(uint32_t));
   xTaskCreate(
                Sender_Task,
                "Sender_Task",
                configMINIMAL_STACK_SIZE,
                (void*) NULL,
                tskIDLE_PRIORITY+4UL,
                NULL
               );
     xTaskCreate(
                Receiver_Task,
                "Receiver_Task",
                configMINIMAL_STACK_SIZE,
                (void*) NULL,
                tskIDLE_PRIORITY+3UL,
                NULL
               );
     xTaskCreate(
                Monitor_Task,
                "Monitor_Task",
                configMINIMAL_STACK_SIZE,
                (void*) NULL,
                tskIDLE_PRIORITY+2UL,
                NULL
               );
vTaskStartScheduler();
for( ;; );

2.Sender_Task

   void Sender_Task(void *pvParameters)
    {
             uint32_t Sendnum=1;

             while(1)
             {
                     xQueueSend(MsgQueue,(void* )&Sendnum,0);
                     Sendsum=Sendsum+Sendnum;
                     Sendnum++;
                     if(Sendnum==10000)
                     {
                        uint32_t Sendnum=1;
                     }
                     vTaskDelay(2);
             }
    }

3.Receiver_Task

 void Receiver_Task(void *pvParameters)
    {
             uint32_t Receivernum=0;

             while(1)
             {
                     while(xQueueReceive(MsgQueue,&Receivernum,
                     0/portTICK_RATE_MS) == pdTRUE)
                     {
                      Receiversum=Receiversum+Receivernum;
                     }
                     vTaskDelay(1000);
             }
    }

4.Monitor_Task

   void  Monitor_Task(void)
    {
           while(1)
           {
             if(Receiversum == Sendsum)
             {
              Green_LED_On();
              vTaskDelay(1000/ portTICK_RATE_MS);
              Green_LED_Off();
             }
             else
             {
              Red_LED_On();
              vTaskDelay(1000/ portTICK_RATE_MS);
              Red_LED_Off();
             }
             vTaskDelay(10000);
           }
    }
时间: 2024-08-11 08:39:58

实时控制软件第二次作业的相关文章

实时控制软件第二次作业--停车场门禁控制系统状态机

作者:李君威U201310747 状态机图示: 将起落杆的位置状态和通行灯信号作为两个类对象,汽车出入闸传感器信号作为输入,编写代码: 1 // qichemenjin.cpp 2 //Copy right by Justin. 3 4 #include "stdafx.h" 5 #include <iostream> 6 using namespace std; 7 class Liftlever 8 { 9 public: 10 bool Leverstate; //起

实时控制软件设计 第一次作业

#include <iostream> #include <cstring> #include <math.h> #include <Eigen/Dense> using Eigen::MatrixXd; using namespace std; class Point {  public:  double x;  double y;  void Showpoint(void);  void movexy(MatrixXd p);//平移算子  void r

实时控制软件第四周作业

冰球游戏系统模块设计: Gui窗口模块:负责整个游戏界面的绘制,作为整个游戏软件的运行载体,目前计划采用Qt窗体程序进行游戏主窗口的创建: OpenGL模块:在Gui窗口中进行游戏元素的绘制: 物理引擎模块:负责进行物理逻辑的计算,主要是碰撞和速度: 定时器模块:负责控制绘制频率: 游戏元素 AI逻辑的处理: 主要是怎样使机械手AI判断球的轨迹并进行拦截. 具体设计如下: 模块接口:所有模块不应该使用构造函数和析构函数以保证按一定的顺序初始化和退出.使用StartUp和ShutDown代替构造函

解题报告——2018级2016第二学期第二周作业

解题报告——2018级2016第二学期第二周作业 D:迷宫问题 题目描述: 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线. 输入 一个5 × 5的二维数组,表示一个迷宫.数据保证有唯一解. 输出 左上角到右

马哥linux 培训第二周作业

注意:第二周作业,请将以下题目整理在51cto博客当中,完成后请将对应的博文链接地址提交在答案栏中,提交格式如下:学号+姓名+博文链接地址eg:1+张三+http://mageedu.blog.51cto.com/4265610/1794420 本周作业内容:1.Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. 文件管理的命令有cp.mv.rm 复制命令:cp 用法: cp [-adfilprsu] 来源文件(source) 目标文件(destination) cp [o

第二次作业 孙榜婷

2.9 设有如下语句,请用相应的谓词公式分别把它们表示出来: (1) 有的人喜欢梅花,有的人喜欢菊花,有的人既喜欢梅花又喜欢菊花 . 解:定义谓词 P(x):x是人 L(x,y):x喜欢y 其中,y的个体域是{梅花,菊花}. 将知识用谓词表示为: (∃x )(P(x)→L(x, 梅花)∨L(x, 菊花)∨L(x, 梅花)∧L(x, 菊花)) (2) 有人每天下午都去打篮 解:定义谓词 P(x):x是人 B(x):x打篮球 A(y):y是下午 将知识用谓词表示为: (∃x )(∀y) (A(y)→

牛老师第二次作业

namespace 第二次作业{    class RandomNumber    {        public int Add(int x, int y)        {            return x + y;        }        public int Sub(int x, int y)        {            return x - y;        }        public int Mul(int x, int y)        {    

Linux+Python高端运维班第二次作业

Linux+Python高端运维班第二次作业 1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可. [[email protected] ~]# who |cut -d" " -f1|uniq (unknown) root test1 [[email protected] ~]# who |cut -d" " -f1|sort -u root (unknown) wangyanglin 2.取出当前系统上被用户当作其默认shel

第二周作业补交(请老师看一下)

#include<stdio.h> #include<math.h> int main(void) { int money,year; double rate,sum; printf("Enter money:"); scanf("%d",&money); printf("Enter year:"); scanf("%d",&year); printf("Enter rate: