计院操作系统实验7

这次实验比较简单,是之前已经实现的综合运用,建议用时120分钟

  1. 实验任务
    1. 信号量结构初始化
      1. src/include/prt_sem_external.h
      1. src/kernel/sem/prt_sem_init.c

比TCB初始化略简单,大差不差

      1. src/kernel/sem/prt_sem_init.c 函数拆解

初始化的过程:

这个函数主要分配了4096个信号量的链表,创建了一个空闲信号量链表

一个create的封装,加了边界判断

      1. src/bsp/os_cpu_armv8_external.h加入宏定义
      1. src/kernel/sem/prt_sem.c

PV(荷兰语)操作的实现,很重要,都是通过关中断实现的原子操作。Pend(P)操作,如果等待的任务没好,就...,如果好了,就切换到队首信号量对应的任务。

Post(V),信号量++。

      1. P操作详解

这是信号量的核心实现部分

先做合法性判断

信号量总数减少,因为是pend等效于wait

设定信号量的主人一个名字。

如果判断信号量大于零就可以直接继续进行了,结束信号量挂起操作。

剩下的操作都是针对信号量小于零的操作

首先是这个信号量挂起段落检查,如果超时了,就返回不可用,或者如果没有取到锁。

注释说,不要在锁任务时pend没有资源可用的信号量。

这里删除队列元素的操作很重要,因为就是这里导致了死锁问题的产生,5个P操作把资源抢光了,都在等待队列里面,没人来唤醒了。

这个切换,有效性存疑,因为下面有点不确定,看下面。

会不会走到快速陷阱里面,因为这样的话,有可能入队,那里还要改吗,试验一下。

接下来就把任务挂在请求队列里面,如果后面进行post操作,那么唤醒队头的程序

      1. V操作详解

在初始化这里改变了senID

二值信号量直接改变性质就可以返回了,不需要队列的那种。剩下的只剩下记录信号量

头和头的下一个人都是自己

得到恢复的任务,然后改变信号量的主人

先删除挂起队列定时列表,然后测试时间是否超时,然后去掉等待标志位

这里要清除标志位,然后出队

还要更新TCB的状态,对齐颗粒度。

这里又再次入运行队了。

要操纵标志位,存疑

      1. src/include/prt_task_external.h 加入声明
      1. src/kernel/task/prt_task.c加入快速切换

专用的陷阱,有排面

      1. src/bsp/os_cpu_armv8_external.h 加入快速trap处理

之前的陷阱

      1. src/include/prt_sem.h头文件

唯一没有异常处理的部分

信号量相关的函数声明和宏定义。

    1. 验证

如果初始化不成功会报错。

    1. 更改Cmake
    1. 成品展示

可以看到2成功让出了运行资源,1向2成功发送了复位信号,实现正确。

    1. 梳理PV操作的过程

首先是要等待的情况,调用pend函数,加入等待队列,从运行队列删除,进入调度程序,调度程序进入陷阱指令,然后调用主调度程序,让OS知道后恢复上下文,然后切换到下一个任务。

如果不需要等待,直接se- - 以后就结束了。

然后是发送的情况,先从等待队列里面删除,然后就把它入队,入队插到运行任务后面,然后再切换任务,调用切换程序,然后和这个pend那边是一样的

    1. Lab7作业

加了一个namepid,方便调试

各种并发问题模拟,至少3种:

哲学家就餐问题。

生产者消费者问题

可以看出来生产者一生产东西就有消费者来吃

读者写者问题,可以看出读者可以并发读,但是写者只能一个个写

这个-2是前面被释放了一次,变成无主信号量了,正常情况

相关推荐
振南的单片机世界17 小时前
EXTI“一线多挂”陷阱:PA0和PB0同时触发,中断函数懵了
arm开发·stm32·单片机·嵌入式硬件
LCMICRO-1331084774620 小时前
国产长芯微LP4807完全P2P替代ADA4807,1mA、300MHz 增益带宽、电压反馈运算放大器
arm开发·嵌入式硬件·fpga开发·硬件工程·运算放大器·ada4807
LCMICRO-1331084774621 小时前
国产长芯微LP8628完全P2P替代AD8628,零漂移、单电源、输入输出轨到轨高精度运放
arm开发·嵌入式硬件·fpga开发·硬件工程·精密运放·ad8628
zlinear数据采集卡3 天前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源
CIAS3 天前
uniontechos-server-20 1050 u2a pxe Server -x86 arm loongarch
arm开发
振南的单片机世界3 天前
推挽vs开漏:一个“强拉硬灌”,一个“只拉不管”
arm开发·stm32·单片机·嵌入式硬件
zlinear数据采集卡3 天前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
硅农程序猿4 天前
从需求到硅片| 一文讲清数字芯片设计流程
arm开发·硬件架构·risc-v
秋田君4 天前
QT_网络编程体系
网络·arm开发·qt
zlinear数据采集卡4 天前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#