基于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实验!
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐