首页 > 其他分享 >FreeRTOS qemu mps2-an385 bsp 移植制作 :串口打印篇

FreeRTOS qemu mps2-an385 bsp 移植制作 :串口打印篇

时间:2023-10-15 13:06:14浏览次数:44  
标签:__ handle FreeRTOS uart qemu 串口 include an385


开发环境

  • 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

前言

FreeRTOS qemu mps2-an385 bsp 移植制作 :系统运行篇 实现了 FreeRTOS 的运行,创建一个task 并成功运行

  • 本篇继续优化,增加串口驱动,让系统运行时打印串口信息

串口驱动

  • qemu mps2-an385 的串口驱动相对简单,当前串口打印只需要关心串口的输出,串口的中断输入,待后续增加 shell 终端功能时再处理
  • 创建 qemu_mps2/driver/drv_uart.c,内容如下:
#include <stdint.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>

#include "drv_uart.h"
#include "CMSDK_CM3.h"

#define DBG_BUFF_MAX_LEN    256
static char rt_log_buf[DBG_BUFF_MAX_LEN] = { 0 };

/* qemu uart dirver class */
struct uart_instance
{
    const char *name;
    CMSDK_UART_TypeDef *handle;
    IRQn_Type irq_num;
    int uart_index;
};

static struct uart_instance uart0_handle = { 0 };

static void uart_putc(uint8_t c)
{
    uart0_handle.handle->DATA = c;
}

static int serial_put(const char *data, int length)
{
    int size;

    size = length;
    while (length)
    {
        uart_putc(*data);
        ++ data;
        -- length;
    }

    return size - length;
}

/* debug print */
int os_printf(const char *fmt, ...)
{
    int length;
    va_list args;
    va_start(args, fmt);
    length = vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args);

    serial_put(rt_log_buf, length);
    return length;
}

void UART0RX_Handler(void)
{
    uint32_t irq_status = 0x00;
    irq_status = uart0_handle.handle->INTCLEAR;
    uart0_handle.handle->INTCLEAR = irq_status;
}

int uart_init(void)
{
    uart0_handle.handle = CMSDK_UART0;
    uart0_handle.uart_index = UART0RX_IRQn;
    uart0_handle.name = "uart0";

    uart0_handle.handle->BAUDDIV = 16; /* 115200bps */
    uart0_handle.handle->CTRL = CMSDK_UART_CTRL_RXIRQEN_Msk | CMSDK_UART_CTRL_RXEN_Msk | CMSDK_UART_CTRL_TXEN_Msk;
    NVIC_EnableIRQ(uart0_handle.irq_num);
    uart0_handle.handle->STATE = 0;

    return 0;
}
  • 这里借助 C 库 函数 vsnprintf,实现格式化输出,实现比较的简单,类似于 printf 功能
  • 创建 qemu_mps2/driver/drv_uart.h 串口头文件
#ifndef __DRV_UART_H__
#define __DRV_UART_H__

#include <stdint.h>

int uart_init(void);
int os_printf(const char *fmt, ...);

#endif //__DRV_UART_H__

修改 main.c 增加串口打印

  • qemu_mps2/application/main.c 中,再创建一个 task,注意 栈空间可以适当的加大,防止栈溢出引发异常
#include "FreeRTOS.h"
#include "task.h"

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

#include "drv_uart.h"

#define TASK_TEST_PRIORITY      (tskIDLE_PRIORITY + 6)
#define TASK_TEST2_PRIORITY     (tskIDLE_PRIORITY + 8)

static void task_test_entry(void *pvParameters)
{
    uint32_t cnt = 0;

    os_printf("%s : enter\r\n", __func__);
    while (1)
    {
        vTaskDelay(1000);
        os_printf("%s : cnt %d\r\n", __func__, cnt++);
    }
}

static void task_test2_entry(void *pvParameters)
{
    uint32_t cnt = 0;

    os_printf("%s : enter\r\n", __func__);
    while (1)
    {
        vTaskDelay(2000);
        os_printf("%s : cnt %d\r\n", __func__, cnt++);
    }
}

void main( void )
{
    uart_init();
    os_printf("%s : enter\r\n", __func__);
    xTaskCreate(task_test_entry, "task_test", 512, NULL, TASK_TEST_PRIORITY, NULL);
    xTaskCreate(task_test2_entry, "task_test2", 512, NULL, TASK_TEST2_PRIORITY, NULL);
    vTaskStartScheduler();
    for( ;; );
}
  • 串口输出信息

FreeRTOS qemu mps2-an385 bsp 移植制作 :串口打印篇_qemu

  • 串口输出正常,两个任务轮流输出

小结

  • 本篇主要实现 qemu mps2-an385 的串口输出打印功能,借助 C 库函数简单实现
  • 后续可以增加串口的 shell 终端功能,到时候会利用起来串口的接收处理


标签:__,handle,FreeRTOS,uart,qemu,串口,include,an385
From: https://blog.51cto.com/zhangsz0516/7871355

相关文章

  • FreeRTOS qemu mps2-an385 bsp 移植制作 :系统运行篇
    开发环境Win1064位+VSCode,ssh远程连接ubuntuVMwareWorkstationPro16+Ubuntu20.04FreeRTOSv202212.01(备注:可以在github获取最新版本)qemuqemu-system-armmps2-an385开发板,qemu版本QEMUemulatorversion4.2.1或更高armgcc交叉编译工具链:当前使用gcc编译环境......
  • 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.将发送给队列的数据复......
  • 2、串口通信
    通信就是各种设备之间的交流,如电脑连接键盘、鼠标、打印机之类的。计算机领域中的通信有两种:串行通信、并行通信。并行通信  -传输原理:数据各个位同时传输。  -优点:速度快  -缺点:占用引脚资源多串行通信  -传输原理:数据按位顺序传输。  -优点:占用引脚......
  • 《Mastering the FreeRTOS Real Time Kernel》读书笔记(2)任务管理
    3.任务管理如何为每个任务分配处理时间,如何选择在任何给定时间执行何种任务,任务优先级,任务状态。3.2任务功能每个任务必须返回void,并接受一个void类型指针。这些任务一般会写成一个无限循环,由内核来调度,完成任务安排,创建和删除。3.3顶层任务状态由于一般单片机处理器为单核......
  • 关于CH32V307 PA6、7引脚复用为串口1和串口7配置方法
    1、复用为串口1配置方法关于PA6和PA7,重映射串口1时,最后下标为3,如下图。换算成二进制为11,重映射对应的就是PA6、PA7,如下图。由于库中没有直接定义该位,因此将PA6、PA7复用为USART1时,需要进行如下操作,如下图。可直接调用GPIO_PinRemapConfig函数,先调用该函数复用为USART1高位,再......
  • 《Mastering the FreeRTOS Real Time Kernel》读书笔记(1)堆内存管理
    这是161204的版本,不完全覆盖目前最新版本的内核。0.关于freeRTOS首先提出了了在小型嵌入式系统中为何需要多任务管理的问题,介绍了freeRTOS的用途。然后开始做广告,吹了一波freeRTOS的好处。其中要注意一些关键的名词:任务优先级分配、任务通知、队列、信号量、互斥锁、软定时器、......
  • QT串口QSerialPort类循环接收可能导致的数据接收不到问题。
    QT串口QSerialPort类循环接收可能导致的数据接收不到问题。建议在使用readAll前调用bytesAvailable来判断缓存区数据是否存在。下面这个程序为错误示范,可能会导致串口数据一直无法读取。QByteArrayresponseData;if(m_serialport->isOpen()){m_serialport->waitForRead......
  • FreeRTOS 和 RT-Thread 功能差别对比
    软件定时器FreeRTOS:定时器函数在task中被调用,居于任务调度的定时器RT-Thread:定时器函数既可以配置为在task中被调用,也可以配置为在tick中断中被调用 ......