第二次作业

实时软件控制第二次作业

例程编译

开发环境搭建:

install ubuntu-16.04.2-desktop-amd64
run commands:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential git
sudo apt-get install gcc-arm-none-eabi gdb-arm-none-eabi
mkdir work
cd work
git clone

QEMU安装

到网页 https://github.com/gnu-mcu-eclipse/qemu/releases/tag/gae-2.8.0-20161227 下载二进制文件 gnuarmeclipse-qemu-debian64-2.8.0-201612271623-dev.tgz到~/work目录

在工作目录解压缩文件,并把路径添加到$PATH变量中

编译例程

在/Projects/Demo1目录下运行make,生成hello_rtos.elf文件
1240738-20170930203548528-843835505.png

QEMU仿真

在/Projects/Demo1目录下提供了一个qemu.sh脚本文件,内容如下:
1240738-20170930203658653-146364548.png

GDB调试

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

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

arm-none-eabi-gdb
在gdb界面内运行:

(gdb)target remote localhost:1234
(gdb)continue
可以看到qemu开始执行程序,GUI界面上可以看到程序执行效果。
1240738-20170930203707137-2015168604.png

1240738-20170930203713981-121652557.png

编程部分

代码链接:https://github.com/hustkingstone/STM32F429_Discovery_FreeRTOS_9/tree/master/Projects/Demo1

send函数

uint32_t send_sum=0;        
uint32_t received_sum=0;
xQueueHandle xQueue;
void vSenderTask(void*pvparameters)
{uint32_t Valuetosend;
uint32_t u1=1;
for(;;)
{vTaskDelay(2);
for(u1=1;;u1++)
  {Valuetosend=u1;
   send_sum+=u1;
xQueueSendToBack(xQueue,&Valuetosend,0);
  if(u1==10000)  
{u1=1;}
}
}
}

基本思路:通过向队列发送数字,并且数字自己加到10000循环,并且声明了全集变量

received函数

void vReceiverTask(void *pvParameters)
{uint32_t ReceivedValue;
for(;;)
{vTaskDelay(1000);
xQueueReceive(xQueue,&ReceivedValue,0);
 received_sum+=ReceivedValue;
}
}

从队列中取出数字并且完成求和的工作

monitor 函数

void Monitor_Task()
{for(;;)
{vTaskDelay(10000);
if(received_sum==send_sum)
{ Green_LED_On();
 Red_LED_Off();}
else
{Green_LED_Off();
Red_LED_On();}
}
}

比较两个数值并且用灯的颜色显示

主函数中的变动

monitor 函数

xQueue=xQueueCreate(1000000,sizeof(uint32_t));

 xTaskCreate(vSenderTask,"Sender",configMINIMAL_STACK_SIZE,NULL,3,NULL);
  xTaskCreate(vReceiverTask,"Receiver",configMINIMAL_STACK_SIZE,NULL,2,NULL);
  xTaskCreate(Monitor_Task,"Monitor",configMINIMAL_STACK_SIZE,NULL,1,NULL);

启动队列之后,注意让第一个任务的优先级最高

本次实验之前忙别的事情了,助教放宽了很多时间才得以完成
在助教的帮助下我认识到了你把声明写到函数调用的代码的后面和函数缺少参数的问题,这都是自己底子不够造成的,之后要认真完成作业。

转载于:https://www.cnblogs.com/hustkingstone/p/7616080.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值