当前位置: 首页 > 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.cnnetsun.cn/news/1349332.html

相关文章:

  • 从0实现OnCall基于Python语言框架
  • MTK Android12预装APK避坑指南:解决Android.mk配置与三方应用签名冲突
  • 打卡信奥刷题(2967)用C++实现信奥题 P5959 [POI 2018] Plan metra
  • 论文人救星!Paperxie:从初稿到终稿,一站式搞定写作 / 绘图 / 排版 / AI 率
  • V-DyKnow A Dynamic Benchmark for Time-Sensitive Knowledge in Vision Language Models
  • Qt导航栏组件A03:VS Code 风格的图标侧栏
  • 【Rust 语言编程知识与应用:表达式详解】
  • 增程式电动汽车自适应ECMS能量管理策略:基于工况的Matlab实现方案
  • C#全自动多线程上位机源码编程 0,纯源代码。 1,替代传统plc搭载的触摸屏。 2,工控屏幕...
  • comsol数值模拟。 金属合金凝固数值模拟,连铸过程数值模拟,相场流场温度场,坯壳厚度计算
  • 基于改进蛇优化算法(GOSO/ISO)优化极限梯度提升树的时间序列预测
  • 在现代工业自动化中,恒压供水系统是一个常见的应用场景,特别是在高楼大厦、工厂和住宅小区中。今天,我们来聊聊如何用三菱PLC和组态王实现三泵变频恒压供水系统
  • 从统一入口到角色化体验:全面理解 SAP Fiori Launchpad 与 SAP Fiori Apps 的实施逻辑
  • 工业检测实战:同轴光源LFV3系列在金属刻印字符识别中的5个关键技巧
  • Hunyuan MT1.5-1.8B API限流设计:生产环境稳定性保障
  • 华为NAT类型选型指南:为什么你的企业网络应该用NAPT而不是静态NAT?
  • dac/cap/lsm
  • Rust impl关键字实战:从封装到多态的全面解析
  • 别再滥用dynamic了!C#动态类型避坑指南与性能优化技巧
  • 从零到一:基于MaxKB与Ollama构建企业级私有化智能知识库
  • LayUI树形下拉选择器实战:5分钟搞定权限管理菜单的动态加载
  • #训练营# 基于GD32E230与CH342F的便携式多功能调试工具:简易示波器+双串口+交换机Console(DB9/蓝牙)
  • CLIP-GmP-ViT-L-14开源大模型教程:CLIP-GmP变体本地化图文评估新范式
  • 图图的嗨丝造相-Z-Image-Turbo实战落地:短视频团队日更100+张风格统一渔网袜封面图方案
  • Github贡献图变身贪吃蛇:自动化工作流配置全解析
  • Flutter嵌入式ARM64 Linux应用实战:从交叉编译到真机部署
  • MusePublic在电商场景的应用:快速生成商品模特图与时尚海报
  • 快速上手:使用Docker Compose一键部署LiuJuan模型及WebUI
  • 收下这6款消除背景工具,让你的PPT、海报、电商图都能再上台阶。
  • 利用GStreamer和SRT协议实现低延迟视频推流与VLC播放实战