实时软件控制第二次作业
例程编译
开发环境搭建:
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文件
QEMU仿真
在/Projects/Demo1目录下提供了一个qemu.sh脚本文件,内容如下:
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界面上可以看到程序执行效果。
编程部分
代码链接: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);
启动队列之后,注意让第一个任务的优先级最高
本次实验之前忙别的事情了,助教放宽了很多时间才得以完成
在助教的帮助下我认识到了你把声明写到函数调用的代码的后面和函数缺少参数的问题,这都是自己底子不够造成的,之后要认真完成作业。