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

计院操作系统实验10

基于QEMU将UART串口重定向至控制台的实现,使用UART串口作为输入设备,通过设置信号量和中断,每次用户输入字符串,GIC会接收到中断号33,随后调用shell进程存储输入至缓冲区并在控制台上回显输入,实现简单的shell功能

本次实验难度比较低,最好随便水水然后赶快去做CS的汇编题目

建议耗时120分钟

目录

1 实验项目一... 3

1.1 项目名称... 3

1.2 实验目的... 3

1.3 实验资源... 4

2 实验任务... 5

2.1.1 src/include/prt_shell.h. 5

2.2 接受输入... 5

2.2.1 src/bsp/print.c. 5

2.2.2 src/bsp/prt_exc.c. 8

2.2.3 src/kernel/task/prt_task.c. 8

2.2.4 src/kernel/tick/prt_tick.c. 8

2.2.5 src/shell/shmsg.c. 9

3 总结... 14

3.1 实验中出现的问题... 14

3.2 真实感受... 14

  1. 实验项目一
    1. 项目名称

SHELL

    1. 实验目的

实现shell

    1. 实验资源

  1. 实验任务
      1. src/include/prt_shell.h

    1. 接受输入
      1. src/bsp/print.c

PRT_UartInit()

定义了一个新的中断用于串口接收

设置了这些操作数的位数

0x24是波特率的设置。之后再启用。

控制位启用接收使能和发送使能非常重要。

OsUartRxHandle()

每次输入字符以后,等到FIFO非空的时候,结束循环,因为已经接收到了字符,基本上也是;轮询polling

      1. src/bsp/prt_exc.c

      1. src/kernel/task/prt_task.c

      1. src/kernel/tick/prt_tick.c

      1. src/shell/shmsg.c

    1. 运行过程

任务启用时,SHELL先WAIT,等待串口输入(shell自己放弃运行,进入阻塞态),串口输入中断号33,调用串口处理程序,把输入的内容传到shell内,并POST,唤醒SHELL,周SHELL继续经过循环等待,直到输入换行符,shell开始解析指令。指令完成后,清空buffer,等待下一次输入。

以上便是一次完整的过程

    1. 作业

这里需要清除中断后才能正常进行信号接收,之前因为我是RR调度,Post会直接运行新的任务(在中断启用之前),所以说,要把Post操作放到这里,才能正常运行并发任务。

实现了创建并发任务,这里以DPP哲学家就餐问题示例,清屏操作,展示当前时钟,展示当前任务,展示当前系统运行轨迹,取消运行轨迹展示还有退出这7个功能。

      1. Flag打印自己的logo

      1. Trace展示系统运行轨迹

从这里可以看出运行过程与之前的分析一致

      1. Untrace关闭追踪

      1. 多线程任务创建以及Top查看运行任务

      1. Tick显示运行时间

      1. Quit退出终端

  1. 总结
    1. 实验中出现的问题
  1. 这次实验比较轻松,主要难点还是之前综合知识点的运用,中断和信号一起上,如果掌握不好会有些应接不暇。
  2. 这次写的驱动和print那次难度差不多,这也不是第一次写驱动了,所以比较容易,看文档也轻松多了。
  3. 我做shell的时候遇到了创建并发任务的时候遇到tick无法更新的bug,因为我是RR调度,这里默认是基于优先级的抢占式调度,他在post的时候,就开始唤醒任务了,导致运行任务的时候没有开中断,只有下一次wait了以后,恢复内核栈的上下文,运行到UARThandler结束后的intclear,才会关闭中断,所以说时间计数一开始才会准确,但是运行并发任务的时候会出问题。
    1. 做完全部实验的真实感受
  4. 感觉这次最后的实验还是放了我们一马,难度相当于实验二的printf
  5. 一路走来,从不会写驱动,到现在稍微会一点嵌入式开发,还是可以的,也解决了许多并发问题
  6. 做完实验以后,才觉得掌握数据结构最重要了,任务调度那块比较难,做出来也对掌握任务的运行状态有帮助。内存mmu那里也很难,理解了页表的数据结构就不难了
  7. 再见了,所有的OS实验!
http://www.jsqmd.com/news/496747/

相关文章:

  • AI一键图片转3D模型工具TrOSR|离线运行·6G显存即可·附详细图文教程
  • 【靶点筛选样本前处理①】细胞膜蛋白的全流程提取实操:标准化制备及验证
  • 使用NPOI包的时候,报错NPOI.OpenXmlFormats.dll不存在
  • 【程序员转行】大厂狂加码AI,零基础程序员/小白必看,这个风口岗位年薪可达36W
  • 从0实现OnCall基于Python语言框架
  • 2026年全国精密传动设备选型:卓创精锐如何以行星、伺服减速机、换向器破解自动化厂家精度困局 - 深度智识库
  • HCIP-AI-EI Developer V2.5 第四章笔记
  • 2026年盱眙C2驾校怎么选?这份父母放心的择校指南请收好 - 2026年企业推荐榜
  • 无迹卡尔曼滤波器(Unscented Kalman Filter,简称 UKF)
  • 乐迪信息:AI防爆摄像机识别船舶违规明火作业
  • Ubuntu服务器上部署Harbor私有镜像仓库:从零到生产的完整指南
  • 分析牌谱1
  • 【PCIe 验证每日学习・Day13】DLLP 与 ACK/NAK 重传机制基础验证
  • 赋予纸片人生命力:高阶通透肌肤物理折射工作流
  • Android jetpack LiveData (二) 原理篇
  • 嵌入式Linux学习-默认规则
  • 无迹卡尔曼滤波器(UKF)在电池 SOC 估算中的应用
  • [拆解LangChain执行引擎]Agent状态是如何被写入通道的?
  • Java+YOLO在PCB质检中的应用:从图像预处理到缺陷分类的全链路优化
  • 2026 年全国优质焦磷酸二氢二钠产品测评指南 靠谱厂商实力盘点 - 深度智识库
  • 【Fidder抓包】+【开发者工具】
  • 8K 超高清时代标杆@ACP#GSV6703 三进一出 HDMI2.1 切换器深度解析
  • 【Rust 语言编程知识与应用:表达式详解】
  • 20260318 模拟赛
  • 【入门篇】第六章 OpenClaw 深度解析:Agent 任务执行流程
  • 详细自适应无迹卡尔曼滤波 (AUKF) 实现
  • 西门子博途1200 PLC的V N积分法卷径计算功能块:SCL源代码解析及收放卷设备应用研究
  • 28个RAG面试高频问题解析:从原理到优化,助你面试稳稳拿捏!
  • Linux HTTP协议
  • 闲置N1盒子别扔!30分钟打造支持远程访问的轻量级NAS(2024最新版)