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

相关文章

FreeRTOS qemu mps2-an385 bsp 移植制作 :环境搭建篇

FreeRTOS qemu mps2-an385 bsp 移植制作 :系统启动篇

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

开发环境

  • 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 qemu mps2-an385 bsp 移植制作 :系统启动篇 配置了 VS Code gdb 调试环境,初步让MCU 启动,进入了启动入口函数

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( ;; );
}
  • 串口输出信息

在这里插入图片描述

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

小结

  • 本篇主要实现 qemu mps2-an385 的串口输出打印功能,借助 C 库函数简单实现

  • 后续可以增加串口的 shell 终端功能,到时候会利用起来串口的接收处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/70094.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ArcGis提取道路中心线

基于ArcGis提取道路中心线 文章目录 基于ArcGis提取道路中心线前言一、生成缓冲区二、导出栅格数据三、导入栅格数据四、新建中心线要素五、生成中心线总结 前言 最近遇到一个问题&#xff0c;根据道路SHP数据生成模型的时候由于下载的道路数据杂项数据很多&#xff0c;所以导…

矢量绘图UI设计软件Sketch mac中文版软件说明

Sketch mac是一款适用于 UI/UX 设计、网页设计、图标制作等领域的矢量绘图软件。 Sketch mac软件特点 1. 简单易用的界面设计&#xff1a;Sketch 的用户界面简洁明了&#xff0c;使得用户可以轻松上手操作&#xff0c;不需要复杂的学习过程。 2. 强大的矢量绘图功能&#xff1a…

Android CameraX适配Android13的踩坑之路

AndroidCameraX适配Android13的踩坑之路 前言&#xff1a; 最近把AGP插件升级到8.1.0&#xff0c;新建项目的时候目标版本和编译版本都是33&#xff0c;发现之前的demo使用Camerax拍照和录像都失败了&#xff0c;于是查看了一下官网和各种资料&#xff0c;找到了Android13的适…

微波光子的参数:噪声系数测量

在微波光子链路中&#xff0c;常用噪声系数&#xff08;NF&#xff1a;Noise Figure&#xff09;来衡量微波信号的信噪比从输入到输出的下降。因而它是结合了噪声和增益二者的一个综合指标。链路的噪声系数表达式为 噪声因子F&#xff1a;输入信噪比除以输出信噪比 噪声系数NF…

学习心得01:STM32开发板

嵌入式开发也不难&#xff0c;相关知识需要学习。对于某个具体内容&#xff0c;需要反复测试、修改。 这是我买的一个开发板&#xff0c;各个范例都跑了一遍&#xff0c;有问题的还问过客服&#xff08;更新代码后解决&#xff09;。

SpringBoot概述及项目的创建使用

文章目录 一. Spring Boot概述1. 什么是Spring Boot&#xff1f;2. Spring Boot的优点 二. Spring Boot项目的创建1. 使用IDEA创建1.1. 准备工作1.2. 创建运行Spring Boot项目1.3. 进行Web交互1.4. 目录工程介绍1.5. 项目快速添加依赖1.6. 防止配置文件乱码所需的配置1.7. Spri…

云安全攻防(十二)之 手动搭建 K8S 环境搭建

手动搭建 K8S 环境搭建 首先前期我们准备好三台 Centos7 机器&#xff0c;配置如下&#xff1a; 主机名IP系统版本k8s-master192.168.41.141Centos7k8s-node1192.168.41.142Centos7k8s-node2192.168.41.143Centos7 前期准备 首先在三台机器上都执行如下的命令 # 关闭防火墙…

Python random模块用法整理

随机数在计算机科学领域扮演着重要的角色&#xff0c;用于模拟真实世界的随机性、数据生成、密码学等多个领域。Python 中的 random 模块提供了丰富的随机数生成功能&#xff0c;本文整理了 random 模块的使用。 文章目录 Python random 模块注意事项Python random 模块的内置…

Matlab的Filter Designer工具设计二阶低通滤波器

Matlab版本&#xff1a;2018b 本文要求&#xff1a;设计一个二阶巴特沃斯低通滤波器用于嵌入式软件滤波&#xff0c;传感器采样频率是20KHz&#xff0c;截止频率是333Hz&#xff0c;获取滤波系数&#xff0c;本文不包括二阶滤波推导和代码编写。 打开Matlab->APP->Filt…

智能数据建模软件DTEmpower 2023R2新版本功能介绍

DTEmpower是由天洑软件自主研发的一款通用的智能数据建模软件&#xff0c;致力于帮助工程师及工科专业学生&#xff0c;利用工业领域中的仿真、试验、测量等各类数据进行挖掘分析&#xff0c;建立高质量的数据模型&#xff0c;实现快速设计评估、实时仿真预测、系统参数预警、设…

拦截器和过滤器的区别

&#x1f600;前言 本篇博文是关于拦截器VS 过滤器的分享&#xff0c;希望你能够喜欢&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我…

Nginx运行Vue项目:基本运行

需求 在Nginx服务器中&#xff0c;运行Vue项目。 说明 Vue项目打包生成的生产文件&#xff0c;是无法直接在浏览器打开的。需要放到Nginx服务器中&#xff0c;才能够访问。 本文章只介绍最基本的情况&#xff1a;Nginx中运行一个Vue项目。 实际生产环境&#xff0c;一个Ng…