首页 > 其他分享 >1. hello rvos

1. hello rvos

时间:2024-06-22 22:42:40浏览次数:10  
标签:__ uart void Register 寄存器 rvos hello define

用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,但我现在还没有精力去了解它,所以就这样吧。

标签:__,uart,void,Register,寄存器,rvos,hello,define
From: https://www.cnblogs.com/algoshimo/p/18262826

相关文章

  • Java:创建一个SpringBoot架构,并尝试访问一个简单的HTML页面:Hello HTML.创建SpringBoot
    下面我们开始教程:第一步:创建Maven工程我这里是Maven工程:之后再在pom文件导入SpringBoot坐标:注:我的平台版本是2020.1,有可能跟大家的不太一样,但创建项目大体类似。Maven即可。直接SpringBoot也可。Next下一步:取名项目名称:InfomanageNext下一步:Fish:然后进入pom.xml......
  • #C:比如有如下两个字符串:“hello“、“helhehe“不能使用库函数完成字符串的比较
    #include<stdio.h>#include<string.h>voidtest00()//比如有如下两个字符串:"hello"、"helhehe"不能使用库函数完成字符串的比较{ //时刻需要注意变量i的值  charbuf1[128]="";   printf("请输入第一个字符串buf1:");   //scanf("%s",buf1);......
  • FastAPI快速入门1 Hello World
    1HelloWorld1.1HelloWorldch01/main.pyfromfastapiimportFastAPI,APIRouter#1app=FastAPI(title="RecipeAPI",openapi_url="/openapi.json")#2api_router=APIRouter()#3@api_router.get("/",status_code......
  • HIT CSAPP 计算机系统大作业 程序人生-Hello’s P2P From Program to Process
    摘 要本文借助hello.c跌宕起伏的一生——P2P(FromProgramToProcess)、020(FromZero-0toZero-0)从源代码到可执行程序以及和计算机系统硬件的配合,从计算机系统的角度阐述从源代码到可执行程序的转变,以及在计算机系统当中作为众多进程中的一员的运行过程。源程序首先经......
  • FASM之Hello消息框
    include'win32ax.inc'.codestart: invokeMessageBox,HWND_DESKTOP,"你好!","hello",MB_OK invokeExitProcess,0.endstart主要使用invoke指令调用MessageBox消息框函数。MessageBox后面的四个参数:第一个参数,HWND_DESKTOP,表示桌面窗口句柄。第二个参数,"你好!",是......
  • SDL3 入门(1):Hello, SDL3!
    在本系列中我们使用WindowsTerminal+Powershell组合作为我们在Windows系统下的终端工具,Windows11自带该环境。你也可以使用任意自己喜欢的终端环境代替,或使用鼠标执行等价的操作。源码准备我们使用git管理我们的项目,所以首先我们创建一个名为"hello_sdl3"的目录并......
  • Hello
    HelloWorld1.随便建立一个文件夹,存放代码2.新建一个Java文件​ 文件后缀名.Java​ 注意系统没有显示后缀名,需要手动打开​ 类名要和文件名一致要不然会报错3.编写代码publicclassHello{ publicstaticvoidmain(String[]args){ System.out.print("Hello,World!......
  • RabbitMQ tutorial - "Hello world!"
    RabbitMQtutorial-"Helloworld!"本例阻塞线程方式一生产者一消费者依赖项abbitMQisinstalledrunningonlocalhostonthestandardport(5672).理解RabbitMQisamessagebroker:itacceptsandforwardsmessages.Youcanthinkaboutitasapostoffic......
  • C语言杂谈:从Hello world说起 #include| main| printf| return
    #include<stdio.h>intmain(){ printf("Hellowworld"); return0;}        打印出“Helloworld”的这个程序相信每个人都是见过的,这段代码非常的简单,没有调用函数,没有使用指针,没有各种杂七杂八的东西,但我相信,第一次看见这个代码的朋友一定会有很多疑问。 ......
  • 哈工大计算机系统大作业——程序人生-Hello’s P2P
    计算机系统大作业题    目  程序人生-Hello’sP2P 专      业      信息安全         学  号      2022112864    班  级     2203201     学      生    xxx   ......