计院操作系统实验10
任务启用时,SHELL先WAIT,等待串口输入(shell自己放弃运行,进入阻塞态),串口输入中断号33,调用串口处理程序,把输入的内容传到shell内,并POST,唤醒SHELL,周SHELL继续经过循环等待,直到输入换行符,shell开始解析指令。基于QEMU将UART串口重定向至控制台的实现,使用UART串口作为输入设备,通过设置信号量和中断,每次用户输入字符串,GIC会接收到中断号33,随
基于QEMU将UART串口重定向至控制台的实现,使用UART串口作为输入设备,通过设置信号量和中断,每次用户输入字符串,GIC会接收到中断号33,随后调用shell进程存储输入至缓冲区并在控制台上回显输入,实现简单的shell功能
本次实验难度比较低,最好随便水水然后赶快去做CS的汇编题目
建议耗时120分钟
目录
2.1.1 src/include/prt_shell.h. 5
2.2.3 src/kernel/task/prt_task.c. 8
2.2.4 src/kernel/tick/prt_tick.c. 8
SHELL
实现shell


PRT_UartInit()

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

设置了这些操作数的位数
0x24是波特率的设置。之后再启用。

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

OsUartRxHandle()


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




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

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

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

-
-
- Trace展示系统运行轨迹
-

从这里可以看出运行过程与之前的分析一致
-
-
- Untrace关闭追踪
-

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

-
-
- Tick显示运行时间
-

-
-
- Quit退出终端
-

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


所有评论(0)