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.pswp.cn/news/40678.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40678.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40678.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何使用Python編寫小游戲?

大家好&#xff0c;我是沐塵而生&#xff0c;如果你是一個熱愛編程的小伙伴&#xff0c;又想嘗試游戲開發&#xff0c;那么這篇文章一定能滿足你的好奇心。不廢話&#xff0c;讓我們馬上進入Python游戲開發的精彩世界吧&#xff01; Python游戲開發的魅力 編寫小游戲不僅僅是鍛…

BUUCTF [安洵杯 2019]easy_serialize_php 1 詳細講解

題目來自buuctf&#xff0c;這是一題關于php序列化逃逸的題 1. 題目 題目給出的代碼 <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_S…

【重復處理】CRUD接口冪等性處理

保證冪等性的核心思想&#xff1a;通過唯一的業務單號保證冪等 非并發情況下&#xff0c;查詢業務單號有沒有操作過&#xff0c;沒有則執行操作針對第一次執行業務時間&#xff0c;有大量并發情況下&#xff0c;整個操作過程加鎖&#xff0c;通過分布式鎖來加鎖Select操作&…

時序預測 | MATLAB實現基于CNN-BiGRU卷積雙向門控循環單元的時間序列預測-遞歸預測未來(多指標評價)

時序預測 | MATLAB實現基于CNN-BiGRU卷積雙向門控循環單元的時間序列預測-遞歸預測未來(多指標評價) 目錄 時序預測 | MATLAB實現基于CNN-BiGRU卷積雙向門控循環單元的時間序列預測-遞歸預測未來(多指標評價)預測結果基本介紹程序設計參考資料 預測結果 基本介紹 MATLAB實現基于…

Dubbo基礎學習

目錄 第一章、概念介紹1.1&#xff09;什么是RPC框架1.2&#xff09;什么是分布式系統1.3&#xff09;Dubbo概述1.3&#xff09;Dubbo基本架構 第二章、服務提供者(直連)2.1&#xff09;目錄結構和依賴2.2&#xff09;model層2.3&#xff09;service層2.4&#xff09;resources…

【eNSP】交換機(vlan和vlan間通信)

【eNSP】交換機&#xff08;vlan和vlan間通信&#xff09; 原理術語過程 實驗根據圖片連接模塊配置設備名稱和IP地址配置交換機交換機鏈路指定sw1配置sw2配置 設置網關交換機互聯實驗設置查看設置結果 ospf配置 原理 HUB集線器&#xff1a;它的作用可以簡單的理解為將一些機器…

【算法系列篇】雙指針

文章目錄 前言什么是雙指針算法1.移動零1.1 題目要求1.2 做題思路1.3 Java代碼實現 2.復寫零2.1 題目要求2.2 做題思路2.3 Java代碼實現 3.快樂數3.1 題目要求3.2 做題思路3.3 Java代碼實現 4.盛最多水的容器4.1 題目要求4.2 做題思路4.3 Java代碼實現 5.有效三角形的個數5.1 題…

k8s 自身原理 4

前面咱們分享了 mater 和 worker 節點里面都有哪些組件&#xff0c;他們又是各自主要負責的工作是什么&#xff0c;現在我們心里應該都有數了吧 master 節點&#xff1a; etcd 存儲資源配置&#xff0c;ApiServer 提供 RESTful Api 用于交互&#xff0c;scheduler 用于調度 p…

VS2019 + Qt : setToolTip的提示內容出現亂碼

VS2019 Qt : setToolTip的提示內容出現亂碼 在使用setToolTip()時&#xff0c; setToolTip(QString("asd你好&#xff01;");標簽提示只有英文是對的&#xff0c;中文是亂碼&#xff01; 應該是編碼出了問題。默認情況下&#xff0c;Qt使用的是UTF-8編碼&#xf…

踩坑經驗:JavaScript 中的 for...of 和 for...in 循環

在 JavaScript 編程中&#xff0c;for...of 和 for...in 是常用的循環語法&#xff0c;但它們在使用時可能會引發一些意想不到的問題。本文將分享我在使用這兩種循環時所遇到的坑和經驗。 兩者的區別&#xff1a; 適用對象類型&#xff1a; for…of&#xff1a;主要用于遍歷可…

數據結構-帶頭雙向循環鏈表的實現

前言 帶頭雙向循環鏈表是一種重要的數據結構&#xff0c;它的結構是很完美的&#xff0c;它彌補了單鏈表的許多不足&#xff0c;讓我們一起來了解一下它是如何實現的吧&#xff01; 1.節點的結構 它的節點中存儲著數據和兩個指針&#xff0c;一個指針_prev用來記錄前一個節點…

Git詳解及使用

Git簡介 Git 是一種分布式版本控制系統&#xff0c;它可以不受網絡連接的限制&#xff0c;加上其它眾多優點&#xff0c;目前已經成為程序開發人員做項目版本管理時的首選&#xff0c;非開發人員也可以用 Git 來做自己的文檔版本管理工具。 大概是大二的時候開始接觸和使用Gi…

云計算——ACA學習 云計算核心技術

作者簡介&#xff1a;一名云計算網絡運維人員、每天分享網絡與運維的技術與干貨。 座右銘&#xff1a;低頭趕路&#xff0c;敬事如儀 個人主頁&#xff1a;網絡豆的主頁????? 寫在前面 本系列將會持續更新云計算阿里云ACA的學習&#xff0c;了解云計算及網絡安全相關…

DeepSpeed加速大模型訓練

DeepSpeed是微軟推出的一個框架&#xff0c;可以對Pytorch的模型進行包裝&#xff0c;提供了加快模型的訓練速度&#xff0c;降低對GPU顯存的占用&#xff0c;以及方便進行分布式訓練等等高級特性。在這里我也對DeepSpeed進行了測試&#xff0c;看看是否能提高我的transformer模…

Maven 插件 maven-antrun-plugin 執行 ant 腳本

Ant 相信大家都不陌生&#xff0c;你可以把它理解為使用 xml 格式描述的一系列命令處理工具。它是一種基于Java的build工具。理論上來說&#xff0c;它有些類似于&#xff08;Unix&#xff09;C中的make、有些類似于基于shell命令編寫的sh腳本文件。Ant 用 Java 的類來擴展。&a…

多維時序 | MATLAB實現PSO-CNN-BiLSTM多變量時間序列預測

多維時序 | MATLAB實現PSO-CNN-BiLSTM多變量時間序列預測 目錄 多維時序 | MATLAB實現PSO-CNN-BiLSTM多變量時間序列預測基本介紹模型特點程序設計參考資料 基本介紹 本次運行測試環境MATLAB2021b&#xff0c;MATLAB實現PSO-CNN-BiLSTM多變量時間序列預測。代碼說明&#xff1a…

Java mail郵件開發 OA辦公系統

目錄 1 Java mail郵件開發 OA辦公系統 1.1 //用戶登錄 1.2 //用戶注冊 1.3 //根據郵箱賬號查詢用戶ID Java mail郵件開發 OA辦公系統package com.email.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement;<

POSTGRESQL 關于2023-08-14 數據庫自動啟動文章中使用KILL 來進行配置RELOAD的問題解釋...

開頭還是介紹一下群&#xff0c;如果感興趣Polardb ,mongodb ,MySQL ,Postgresql ,redis &#xff0c;SQL SERVER ,ORACLE,Oceanbase 等有問題&#xff0c;有需求都可以加群群內有各大數據庫行業大咖&#xff0c;CTO&#xff0c;可以解決你的問題。加群請加 liuaustin3微信號 &…

Oracle執行計劃

Oracle執行計劃 1. 什么是執行計劃Oracle explain使用3. Explain執行順序 1. 什么是執行計劃 執行計劃是一條查詢語句在Oracle中的執行過程或訪問路徑的描述。 執行計劃描述了SQL引擎為執行SQL語句進行的操作&#xff1b;分析SQL語句相關的性能問題或僅僅質疑查詢優化器的決定…

蔚來李斌賣手機:安卓系統,蘋果售價,一年一發

?作者 | Amy 編輯 | 德新 車圈大佬的玩法真讓人尋不著套路&#xff01; 蘋果的庫克和小米的雷布斯&#xff0c;甚至是FF賈老板準備許久&#xff0c;都想分一塊新能源車的蛋糕&#xff0c;蔚來李斌卻反手進軍手機界&#xff0c;從宣布造手機到手機入網僅僅隔了一年。 近期…