当前位置: 首页 > wzjs >正文

徐州网站建设优化贵州建设职业技术学院网站查成绩

徐州网站建设优化,贵州建设职业技术学院网站查成绩,京东商城官网入口,重庆专门做网站的公司2.1 实验目的 为os添加uart功能,通过串口实现开发板与PC交互。 2.1 硬件信息 QEMU虚拟SoC含有 虚拟NS16550A设备 。 不同的地址线组合(A2、A1、A0)对应的读写模式和寄存器如下所示: 2.2 NS16550a 的初始化 线路控制寄存器&#…

2.1 实验目的

为os添加uart功能,通过串口实现开发板与PC交互。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.1 硬件信息

QEMU虚拟SoC含有 虚拟NS16550A设备 。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不同的地址线组合(A2、A1、A0)对应的读写模式和寄存器如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.2 NS16550a 的初始化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

线路控制寄存器(LCR)中的bit7位来实现复用DLL、DLM两个寄存器拼起来作为16位波特率寄存器。当bit7位被设置为1时,地址0和1用于访问除数锁存寄存器(DLL和DLM),用于设置波特率。

  • 关闭中断
  • 设置波特率
  • 设置异步数据通信格式
void uart_init()
{/* disable interrupts. */uart_write_reg(IER, 0x00);/** Setting baud rate. Just a demo here if we care about the divisor,* but for our purpose [QEMU-virt], this doesn't really do anything.** Notice that the divisor register DLL (divisor latch least) and DLM (divisor* latch most) have the same base address as the receiver/transmitter and the* interrupt enable register. To change what the base address points to, we* open the "divisor latch" by writing 1 into the Divisor Latch Access Bit* (DLAB), which is bit index 7 of the Line Control Register (LCR).** Regarding the baud rate value, see [1] "BAUD RATE GENERATOR PROGRAMMING TABLE".* We use 38.4K when 1.8432 MHZ crystal, so the corresponding value is 3.* And due to the divisor register is two bytes (16 bits), so we need to* split the value of 3(0x0003) into two bytes, DLL stores the low byte,* DLM stores the high byte.*/uint8_t lcr = uart_read_reg(LCR);uart_write_reg(LCR, lcr | (1 << 7));uart_write_reg(DLL, 0x03);uart_write_reg(DLM, 0x00);/** Continue setting the asynchronous data communication format.* - number of the word length: 8 bits* - number of stop bits:1 bit when word length is 8 bits* - no parity* - no break control* - disabled baud latch*/lcr = 0;uart_write_reg(LCR, lcr | (3 << 1));
}

原代码这里是这样,感觉不太对,应该是左移一位的。

lcr = 0;
uart_write_reg(LCR, lcr | (3 << 0));

2.3 NS16550a 的数据读写

在NS16550A UART中,区分读写模式是通过控制信号(如读/写控制线)来实现的,而不是通过寄存器地址。这些控制信号通常由CPU或其他主控设备提供。以下是区分读写模式的一般步骤:

  1. 当CPU或其他主控设备想要从UART读取数据时,它会将读控制线置为有效状态(低电平)。同时将芯片选择信号置为有效状态,以选中UART设备。
  2. 当CPU或其他主控设备想要向UART写入数据时,它会将写控制线置为有效状态(低电平)。同样将芯片选择信号置为有效状态,以选中UART设备。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

读:

/** LINE STATUS REGISTER (LSR)* LSR BIT 0:* 0 = no data in receive holding register or FIFO.* 1 = data has been receive and saved in the receive holding register or FIFO.* ......* LSR BIT 5:* 0 = transmit holding register is full. 16550 will not accept any data for transmission.* 1 = transmitter hold register (or FIFO) is empty. CPU can load the next character.* ......*/
#define LSR_RX_READY (1 << 0)
#define LSR_TX_IDLE  (1 << 5)int uart_putc(char ch)
{while ((uart_read_reg(LSR) & LSR_TX_IDLE) == 0);return uart_write_reg(THR, ch);
}void uart_puts(char *s)
{while (*s) {uart_putc(*s++);}
}

写:

练习 7-2

要求:参考code/os/01-helloRVOS,在此基础上增加采⽤轮询⽅式读取控制台上输入的字符并 回显 在控制台上。另外⽤户按下回⻋后能够另起⼀⾏从头开始。

int uart_getc()
{char ch;while ((uart_read_reg(LSR) & LSR_RX_READY) == 0);ch = uart_read_reg(RHR);return ch;
}void uart_gets(char *s, int len)
{int i = 0;char ch;while (i < len - 1) {ch = uart_getc(); if (ch == '\r') { break;}s[i++] = ch;}s[i] = '\0'; 
}/*** 回显功能:读取用户输入并回显到控制台*/
void uart_echo()
{char buffer[100]; 	uart_puts("UART Echo Ready:\r\n");while (1) {uart_gets(buffer, sizeof(buffer)); uart_putc('\r'); uart_putc('\n'); uart_puts("--kernel收到数据--\n");uart_puts(buffer);uart_putc('\r'); uart_putc('\n'); }
}

最后一定记得在kernel.c添加extern声明:

extern void uart_echo(void);void start_kernel(void)
{uart_init();uart_puts("Hello, RVOS!\n");uart_echo();  // 开始回显while (1) {}; // stop here!
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

存在一个问题就是在终端输入的内容无法显示,且无法删除。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


问题解决:在当前实现中,输入的字符虽然被回显,但无法正确处理删除键(Backspace)的功能。这是因为 uart_gets 函数没有对删除键 (‘\b’ 或 ASCII 8) 进行处理。以下是改进方案:

我们需要在 uart_gets 中添加对删除键的处理逻辑。当用户按下删除键时,应该从缓冲区中移除最后一个字符,并在终端上删除回显的字符。

void uart_gets(char *s, int len)
{int i = 0;char ch;while (i < len - 1) {ch = uart_getc(); // 读取一个字符if (ch == '\r') { // 如果是回车符,结束读取break;} else if (ch == '\b' || ch == 127) { // 处理删除键('\b' 或 ASCII 127)if (i > 0) {i--; // 从缓冲区中移除最后一个字符uart_putc('\b'); // 回显删除键uart_putc(' ');  // 用空格覆盖已删除的字符uart_putc('\b'); // 将光标移回一格}} else {s[i++] = ch; 	// 存储字符uart_putc(ch); 	// 回显输入的字符}}s[i] = '\0'; // 添加字符串结束符
}

问题完美解决!!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

【[完结] 循序渐进,学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春】 https://www.bilibili.com/video/BV1Q5411w7z5/?p=19&share_source=copy_web&vd_source=d63943fdb26087d14a536adf35c52d6b


文章转载自:

http://QDgnyJ4E.psxwc.cn
http://QekQgEQ7.psxwc.cn
http://49EZO5Lv.psxwc.cn
http://490vqWBG.psxwc.cn
http://FJIyJGEG.psxwc.cn
http://IhUWTpvr.psxwc.cn
http://1luadhNE.psxwc.cn
http://pR3QDVIt.psxwc.cn
http://vb3fK5T0.psxwc.cn
http://KJ6f9IEO.psxwc.cn
http://jqXQKwkh.psxwc.cn
http://0IuQ1PE5.psxwc.cn
http://2POsx8jx.psxwc.cn
http://OqMJLISq.psxwc.cn
http://JqYvKidA.psxwc.cn
http://ud7ZgXGj.psxwc.cn
http://2iZuhxRA.psxwc.cn
http://BFkN3J2B.psxwc.cn
http://G7rfI2Ys.psxwc.cn
http://4Vyo8Xbi.psxwc.cn
http://WNwhn9Z6.psxwc.cn
http://Lnok7mUK.psxwc.cn
http://21QllY5l.psxwc.cn
http://kwgFKbSR.psxwc.cn
http://1F6x6jEJ.psxwc.cn
http://iIJtcCad.psxwc.cn
http://vKM8PwjM.psxwc.cn
http://DSlXthjj.psxwc.cn
http://TLt1vsgI.psxwc.cn
http://cM1HvWVP.psxwc.cn
http://www.dtcms.com/wzjs/618391.html

相关文章:

  • 网站开发的项目背景中信建设有限责任公司 乔锋 电话
  • 北京贸易公司网站制作wordpress用户密码
  • 河北省建设中心网站奥运网站模板
  • 人社局网站建设管理工作总结wordpress主题搭建
  • 西宁网络信息 网站建设建设银行网站怎么不可登入
  • 天津制作企业网站报价中国空间站视频
  • 共享办公wework萧山区seo关键词排名
  • 禅城建网站官方网站建设合作协议
  • 怎样购买网站程序中企动力做网站多少钱
  • 机关局域网网站建设wordpress如何添加首页
  • 网站运营适合什么样的人做seo案例分享
  • 做易拉宝的网站yum安装wordpress
  • 上海泵阀网站建设大学毕业做网站插画师好吗
  • 网站建设单页面推广模板ps做游戏下载网站
  • 做vip电影网站网站没有排名
  • 宣城网站seo国外设计公司名字
  • 成都手机网站建设报价表沧州网站推广优化
  • 手机网站一年费用吗wordpress 4.1分页
  • 西安网站推广公司电话维度 网站建设
  • 网站开发建设价格附件网站建设壹金手指六六1
  • 建设工程信息化考试报名网站网站建设与维护培训
  • 网站颜色配色wordpress取消邮件
  • 婚纱网站策划书最简单仓库管理软件
  • 杭州网站建设提供商电子商务网站规划方案
  • 做视频网站 带宽多少才合适公众号怎么制作小程序
  • 广州网站开发工程师赛门仕博做网站怎么样
  • 免费网站推广网站破解版网站开发制作软件
  • 网站做反向代理后样式加载错误网站广告如何做
  • 做网站写代码怎么样做网站准备的资料
  • 超链接到网站怎么做视频文件下载佛山市建网站做网站费用