1. hello rvos

news/2024/9/24 2:36:36

用qemu模拟器模拟一块仿真的板子,然后通过模拟的串口线,在主机上打印hello

在qemu中,关于uart寄存器的内存映射如图(物理地址)

1. 源代码剖析

1. platform.h

用来定义开发板上的一些东西

#ifndef __PLATFORM_H__  
#define __PLATFORM_H__
//这些宏用于防止重复包含头文件。#ifndef 检查宏 __PLATFORM_H__ 是否未定义,如果未定义,则定义它并继续包含文件内容。#define MAXNUM_CPU 8  //定义系统中支持的最大 CPU 数量为 8 个#define UART0 0x10000000L 
//定义 UART0 的基地址为 0x10000000L。这个地址将用于访问 UART 控制寄存器#endif /* __PLATFORM_H__ */

2. uart.c

整个uart.c包含uart初始化函数,读,写函数

uart初始化大概是设置分频寄存器从而设置波特率
读,写函数中的while循环都是寄存器不空闲而在等待

//整个uart寄存器被映射到内存中#include "types.h"
#include "platform.h"#define UART_REG(reg) ((volatile uint8_t *)(UART0 + reg))
//用于计算特定 UART 寄存器的地址
//uart0是基地址,reg对应的是第26行开始定义的那些寄存器。define RHR 0代表RHR寄存器偏移量为0//定义了一组宏,用于访问不同的 UART 寄存器
#define RHR 0	// Receive Holding Register (read mode)
#define THR 0	// Transmit Holding Register (write mode)
#define DLL 0	// LSB of Divisor Latch (write mode)
#define IER 1	// Interrupt Enable Register (write mode)
#define DLM 1	// MSB of Divisor Latch (write mode)
#define FCR 2	// FIFO Control Register (write mode)
#define ISR 2	// Interrupt Status Register (read mode)
#define LCR 3	// Line Control Register
#define MCR 4	// Modem Control Register
#define LSR 5	// Line Status Register
#define MSR 6	// Modem Status Register
#define SPR 7	// ScratchPad Register#define LSR_RX_READY (1 << 0)
#define LSR_TX_IDLE  (1 << 5)//uart_read_reg 和 uart_write_reg 用于读写寄存器
#define uart_read_reg(reg) (*(UART_REG(reg)))
#define uart_write_reg(reg, v) (*(UART_REG(reg)) = (v))void uart_init()
{/* disable interrupts. */uart_write_reg(IER, 0x00);  //将中断使能寄存器 (IER) 设置为 0,禁用了所有 UART 中断uint8_t lcr = uart_read_reg(LCR);  //读取当前的 Line Control Register (LCR)。uart_write_reg(LCR, lcr | (1 << 7)); //将 LCR 的 DLAB 位 (第 7 位) 置 1,以打开分频寄存器访问。uart_write_reg(DLL, 0x03);  //设置分频寄存器的低字节 (DLL) 和高字节 (DLM)uart_write_reg(DLM, 0x00);lcr = 0;uart_write_reg(LCR, lcr | (3 << 0));}int uart_putc(char ch)
{while ((uart_read_reg(LSR) & LSR_TX_IDLE) == 0); //若THR不空闲,则等待return uart_write_reg(THR, ch);
}void uart_puts(char *s)
{while (*s) {uart_putc(*s++);}
}// 读取一个字符
char uart_getc() {while ((uart_read_reg(LSR) & LSR_RX_READY) == 0);return uart_read_reg(RHR);
}

3. kernel.c

extern void uart_init(void);
extern void uart_puts(char *s);void start_kernel(void)
{uart_init();uart_puts("Hello, RVOS!\n");while (1) {}; // stop here!
}

2. exercise

在源代码基础上增加采用轮询方式读取控制台上输入的字符并回显在控制台上,另外用户按下回车后能够另起一行从头开始

extern void uart_init(void);
extern void uart_putc(char ch);
extern char uart_getc();
void start_kernel(void)
{uart_init();while(1){char ch = uart_getc();uart_putc(ch);}while (1) {}; // stop here!
}

这段代码我是本能写出来的,它也确实是对的。

但我不知道他为什么就实现了回车后能够另起一行从头开始
想了解这个估计要深入理解uart,但我现在还没有精力去了解它,所以就这样吧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

基于鲸鱼优化的knn分类特征选择算法matlab仿真

1.程序功能描述基于鲸鱼优化的KNN分类特征选择算法。使用鲸鱼优化算法,选择最佳的特征,进行KNN分类,从而提高KNN分类的精度。2.测试软件版本以及运行结果展示 MATLAB2022a版本运行 3.核心程序%---开始迭代--------------------------------------------------- while t &…

UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359) 题解

点我看题 A - Count Takahashi 没啥好说的点击查看代码 #include <bits/stdc++.h>#define rep(i,n) for(int i=0;i<n;++i) #define repn(i,n) for(int i=1;i<=n;++i) #define LL long long #define fi first #define se second #define pb push_back #define mpr m…

20240622-PowerShell5和PowerShell7在windows terminal中无法切换

今天安装powertoys小工具commandNotFound的时候,提示要求powershell版本是7,而当前powershell版本是5,如下。但是powertoys中显示powershell7已经安装,如下图。主要问题在于powershell5的程序名是 powershell.exe, 而powershell7的程序名是pwsh.exe. windows terminal每个选…

go - Monitoring

保证高可用的方法1. 日志2. 链路追踪3. 监控   1. 业务监控(领导层) OPS/DAU/访问状态 http code/业务接口(登陆注册聊天上传留言搜索)   2. system monitoring   (运维) operating system: cpu/memory/disk usage/disk space/TCP(上w的连接),流量 组件:mysql,redi…

萌熊6月j讲题

A 解法一(官方解法): 要求每段的二进制或都相同,那么如果整个序列中存在某个数的第 \(i\) 位为 \(1\),那么整个序列的每一段长 度为 \(k\) 的连续子序列中都至少有一个数的第 \(i\) 位为 \(1\)。 我们可以对每一位单独求一个满足条件的最小的 \(k\),然后所有位的 \(k\) 的…

黑马:AI+若依

AI+若依 https://www.bilibili.com/video/BV1pf421B71v/?spm_id_from=333.337.search-card.all.click&vd_source=b1acc63fa6d7d73e53111f9e1153f990若依扫盲通义灵码(AI)CRM客户关系管理系统(后台管理系统) 选型与搭建:技术选型,环境搭建,框架整合(AI凉凉) 设计:…

2024-06-22:用go语言,给定一个起始下标为 0 的长度为3的整数数组 nums,根据这些数字构建三角形。 如果无法构成三角形,则返回 “none“; 否则根据三角形的边长关系返回对应类型的字

2024-06-22:用go语言,给定一个起始下标为 0 的长度为3的整数数组 nums,根据这些数字构建三角形。 如果无法构成三角形,则返回 "none"; 否则根据三角形的边长关系返回对应类型的字符串: equilateral(等边三角形)、isosceles(等腰三角形)或 scalene(不等边三…

BLE低功耗蓝牙

ble低功耗蓝牙 ble流量嗅探与重放 低功耗蓝牙协议栈 BLE是低功耗蓝牙的英文缩写(Bluetooth Low Energy),是蓝牙4.0版本起开始支持的新的、低功耗版本的蓝牙技术规范。 低功耗蓝牙瞄准多个市场,特别是移动智能终端,智能家居,互联设备等领域,主要特点包括:低功耗,使用纽…