首页 > 其他分享 >FreeRTOS qemu mps2-an385 bsp 移植制作 :系统运行篇

FreeRTOS qemu mps2-an385 bsp 移植制作 :系统运行篇

时间:2023-10-15 13:05:51浏览次数:28  
标签:task FreeRTOS an385 void bsp mps2 main qemu

开发环境

  • Win10 64位 + VS Code,ssh 远程连接 ubuntu
  • VMware Workstation Pro 16 + Ubuntu 20.04
  • FreeRTOSv202212.01(备注:可以在 github 获取最新版本)
  • qemu qemu-system-arm mps2-an385 开发板,qemu 版本 QEMU emulator version 4.2.1 或更高
  • arm gcc 交叉编译工具链:当前使用 gcc 编译环境, gcc-arm-11.2-2022.02-x86_64-arm-none-eabi, gcc version 11.2.1 20220111

前言

中断向量表

  • 为了实现系统 systick 定时器与 任务调度,FreeRTOS 实现了 systick、pendSV 等功能,需要关联启动文件
  • qemu_mps2/application/FreeRTOSConfig.h 中,追加
#define vPortSVCHandler         SVC_Handler
#define xPortPendSVHandler      PendSV_Handler
#define xPortSysTickHandler     SysTick_Handler
  • 【备注】这个 FreeRTOSConfig.h 可以从FreeRTOS 的 相关 demo 中复制出来并修改,当前复制于 FreeRTOSv202212.01\FreeRTOS\Demo\CORTEX_MPS2_QEMU_IAR_GCC\FreeRTOSConfig.h
  • 这样就对接了系统的 systick 定时器与任务调度中断处理:PendSV_Handler

让启动直接进入 main 函数

  • 默认第一个执行函数是:qemu_mps2/CMSDK_CM3/Source/GCC/startup_CMSDK_CM3.S 中的 Reset_Handler,当前调试发现 bl _start 时会卡住,所以这里直接改为 bl main,也就是跳转到 main 函数

FreeRTOS qemu mps2-an385 bsp 移植制作 :系统运行篇_FreeRTOS

  • main.c 的代码如下:
#include "FreeRTOS.h"
#include "task.h"

#include <stdio.h>
#include <string.h>

#define TASK_TEST_PRIORITY      (tskIDLE_PRIORITY + 6)

static void task_test_entry(void *pvParameters)
{
    while (1)
    {
        vTaskDelay(1000);
    }
}

void main( void )
{
    xTaskCreate(task_test_entry, "task_test", configMINIMAL_STACK_SIZE, NULL, TASK_TEST_PRIORITY, NULL);
    vTaskStartScheduler();
    for( ;; );
}
  • 这里暂时没有开启串口打印,后续补上,创建一个 task,taks 里面什么都不干,就是 1秒延时

ilde 与 timer 任务栈

  • 编译并运行后,发现出现了断言,提示 idle task 的 栈指针为空,经过分析发现,需要完善 idle 线程栈的获取函数,当前 timer task 的栈也需要完善,比如使用静态数组作为 task 的线程栈
  • hook 等函数在 qemu_mps2/application/port.c 中实现,完善
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )
{
    static StaticTask_t xIdleTaskTCB;
    static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];

    *ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
    *ppxIdleTaskStackBuffer = uxIdleTaskStack;
    *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}

void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize )
{
    static StaticTask_t xTimerTaskTCB;
    static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ];

    *ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
    *ppxTimerTaskStackBuffer = uxTimerTaskStack;
    *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
}
  • 再次编译后调试运行,发现 FreeRTOS 正常进入 task 任务函数,并且周期性的工作(1秒的延时)

FreeRTOS qemu mps2-an385 bsp 移植制作 :系统运行篇_qemu_02

  • 以上说明 FreeRTOS 系统运行起来了,初步移植成功

小结

  • 后续继续实现系统串口的打印功能,让系统运行可以看的到
  • 后续继续完善 FreeRTOS 的 例程,比如实现多任务间的通信等功能


标签:task,FreeRTOS,an385,void,bsp,mps2,main,qemu
From: https://blog.51cto.com/zhangsz0516/7871356

相关文章

  • FreeRTOS qemu mps2-an385 bsp 移植制作 :环境搭建篇
    开发环境Win1064位+VSCode,ssh远程连接ubuntuVMwareWorkstationPro16+Ubuntu20.04FreeRTOSv202212.01(备注:可以在github获取最新版本)qemuqemu-system-armmps2-an385开发板,qemu版本QEMUemulatorversion4.2.1或更高armgcc交叉编译工具链:当前使用gcc编译环境......
  • 《Mastering the FreeRTOS Real Time Kernel》读书笔记(4)软定时器
    5.软件定时器管理软件定时器由FreeRTOS内核实现,并受其控制。它们不需要硬件支持,也与硬件计时器或硬件计数器无关。软件定时器功能是可选的。包括软件定时器功能:1。作为项目的一部分,构建FreeRTOS源文件FreeRTOS/source/timers.c。2.在FreeRTOSConfig.h中将configUSE_TIMERS设置为......
  • 《Mastering the FreeRTOS Real Time Kernel》读书笔记(3)队列管理
    4.队列管理队列,在一些系统中被称为消息队列,可以理解为信息中转站。是任务和任务,任务和中断之间可以互相读和写的一个共享空间。4.2队列的特征存储数据队列本质上是一个先进先出的缓冲区(FIFO),所以可以存储一定容量的数据。有两种方式可以实现FIFO队列:1.将发送给队列的数据复......
  • 《Mastering the FreeRTOS Real Time Kernel》读书笔记(2)任务管理
    3.任务管理如何为每个任务分配处理时间,如何选择在任何给定时间执行何种任务,任务优先级,任务状态。3.2任务功能每个任务必须返回void,并接受一个void类型指针。这些任务一般会写成一个无限循环,由内核来调度,完成任务安排,创建和删除。3.3顶层任务状态由于一般单片机处理器为单核......
  • vue3+vite import 引入ThreeBSP库 报错
    我在网上查了一下先用npm下载了三方包npmithree-js-csg再使用constThreeBSP=require('three-js-csg')(THREE)的方法引入出现了这个报错查了是因为require是webpack里的vite不支持所以找不到然后我就尝试使用import的方法引入importThreeBSPfrom'three-js......
  • 《Mastering the FreeRTOS Real Time Kernel》读书笔记(1)堆内存管理
    这是161204的版本,不完全覆盖目前最新版本的内核。0.关于freeRTOS首先提出了了在小型嵌入式系统中为何需要多任务管理的问题,介绍了freeRTOS的用途。然后开始做广告,吹了一波freeRTOS的好处。其中要注意一些关键的名词:任务优先级分配、任务通知、队列、信号量、互斥锁、软定时器、......
  • FreeRTOS 和 RT-Thread 功能差别对比
    软件定时器FreeRTOS:定时器函数在task中被调用,居于任务调度的定时器RT-Thread:定时器函数既可以配置为在task中被调用,也可以配置为在tick中断中被调用 ......
  • FreeRTOS添加计时器
    最近需要将在Linux上的代码移植到FreeRTOS上,许多系统函数运行不了,其中就包括gettimeofday,以及使用定时器的不同。FreeRTOS的时间管理首先,FreeRTOS的系统时钟节拍可以在配置文件FreeRTOSConfig.h里面设置:#defineconfigTICK_RATE_HZ((TickType_t)1000)//配置系统时......
  • FreeRTOS入门教程(队列详细使用示例)
    (文章目录)前言上篇文章我们已经讲解了队列的概念和队列相关的API函数,那么本篇文章的话就开始带大家来学习使用队列。一、队列基本使用这个例子将会创建三个任务,其中两个任务用来发送数据到队列中,另一个任务用来从队列中读取数据。voidTask1Function(void*param){ intv......
  • 十九、STM32移植FreeRTOS操作系统
    1.环境安装下载FreeRTOS源码2.移植2.1在STM32项目下创建freertos文件夹,然后在文件夹下创建inc、src、port文件夹2.2将FreeRTOS源码目录下的FreeRTOS/Source/include文件夹下的.h头文件全部复制到STM32项目的freertos/inc文件夹下2.3 将FreeRTOS源码目录下的FreeRTOS/Sourc......