实时控制软件第二次作业

本文介绍如何在STM32F4上使用FreeRTOS实现任务调度及通信,包括开发环境搭建、QEMU仿真、GDB调试等步骤。并通过实例演示创建三个不同周期的任务,实现数据发送、接收与监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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); } }

 

转载于:https://www.cnblogs.com/wall-f/p/7615943.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值