精华内容
下载资源
问答
  • 纵所周知的是,C语言是顺序程序设计的,那么在一些MCU中,例如STM32,Atmega168等等,在微观上程序都是单线程的,那么应该如何实现微观线程呢?这用到两东西:一是中断,二是switch语句。听老夫为你细细道...

    1.

    纵所周知的是,C语言是顺序程序设计的,那么在一些MCU中,例如STM32,Atmega168等等,在微观上程序都是单线程的,那么应该如何实现微观上的多线程呢?这个用到两个东西:一是中断,二是switch语句。听老夫为你细细道来。

     

    2.

    举个例子来说,比如我想要实现的是:MCU每2秒通过6个USART向外发送数据。一般大家首先想到的是,配置一个定时器,每2S进入一个中断函数,然后中断函数里面写入:

    USART0();	//启动串口0发送
    USART1();	//启动串口1发送
    USART2();	//启动串口2发送
    USART3();	//启动串口3发送
    USART4();	//启动串口4发送
    USART5();	//启动串口5发送
    

    但是这样会存在一个问题呀。首先我可以把启动串口发送到发送数据成功分为几个部分:

    1. 拉高串口读写控制端I/O,使其变为发送模式; 2. 准备要发送的数据,对数据进行组包,这一步是很耗时间的; 3. 检测串口数据是否发送完成 ; 4.在串口发送完成的时候,拉低串口读写控制端I/O,使其变为接收模式  

    仅仅在串口发送的就会有两个while(1),如下图所示,这无疑拖慢了CPU的运行速度,那么应该如何优化呢?

      //--------------------启动发送-----------------------------//
    	UART0_TX;                             //使串口处于发送状态
    	i=0;
    	while(i<30)                           //一共发送30个字节
    	{
    		while(!(UCSR0A & (1<<UDRE0)));    //等待 “准备数据接收”
    		UDR0 = *(TX_buf_MCU+(i++));       //开始发送数据
    		while( !( UCSR0A & (1<<TXC0)) );  //等待“发送完成”
    		UCSR0A |= (1<<TXC0);              //发送完成后清除中断标志位
    	}
    	UART0_RC; //发送完毕,再次使串口处于接收状态

     

     

    3.

    先贴出代码,再详细说出

    void PollingSending()
    {
    	for (uint8_t i = 0;i < 7;i ++)              //6个通道轮询发送,故循环6次
    	{ 
    		switch(ComState[i])                     //ComState[i]表示第i个串口所处的状态
    		{
    			case 0:                 
    				if (PollingSending_Flag == 1)   //当2S到,PollingSending_Flag置1
    				{
    					ComState[i] = 1;             //跳到状态1
    				}
    			break;
    			case 1:
    				PollingSending_Flag = 0;         //清除2S标志位
    				prepareData(i);		             //准备待发送数据包
    				RS485_out(i);                    //拉高IO口,准备发数据
    				ComState[i] = 2;
    			break;
    			case 2:
    				USARTSendStart(i);			   	//第i个串口开始发送,此时会进入串口发送函数
    				ComState[i] = 3;	
    			break;
    			case 3:
    				if (TxComplete[i] == 1)          //发送完成
    				{
    					RS485_in(i);                 //拉低I0口,变为待接收状态
    					ComState[i] = 0;
    				}
    			break;	
    		}
    	}	
    }
    
    
    ISR(USART0_TXC_vect)     //串口0的中断发送函数
    {	
    
    	if (TxLen[i] < 6)     //发送6个字节
    	{
    	  USART0_UDR0 =  txbuf[TxLen]; //发送一个字节后会进入发送中断,进而发送另外一个字节
    	  TxLen[chn]++;
        }
    	else
    	{
    		TxLen[i] = 0;
    		TxComplete[i] = 1;	//发送完毕
    	}
    }
    
    
    
    
    int main(void)
    {
    
    	sysinit();	//初始化
    	while(1)
    	{
    		wdt_reset();  //复位看门狗
    		PollingSending();			
    	}
    }
    

    此程序的优点所在是:每一个串口都有4种状态,比如 

     USART0:ComState[0]=0  准备发送数据

     USART1:ComState[1]=3  发送完成状态

     USART2:ComState[2]=2  正在发送状态

    即单线程系统每次走一步,但这一步可能USART0再走,也有可能USART1拿去了。且之前也提过了,是中断发送,系统有可能处在USART1配置发送数据包的时候,这时 USART0的UCSR0A & (1<<UDRE0) == 1 了;    //等待 “准备数据接收”  准备好了,那么系统就去发送USART0的数据了,关键在于,若下一时刻( UCSR0A & (1<<TXC0)) ;  //等待“发送完成”  还没发送完,则系统可以不用一直在while( !( UCSR0A & (1<<TXC0)) );  //等待“发送完成”,系统可以跳出中断函数,走主程序,即继续配置USART1的数据包,这样就实现了微观上单线程,而宏观上多线程的目的。

    展开全文
  • 程序系统

    千次阅读 2017-07-10 20:10:36
    我们讨论其中的程序系统 程序设计技术是在计算机内存中同时存放几道相互独立的程序...对于一单CPU系统来说,程序同时处于运行状态只是一种宏观上的概念,他们虽然都已经开始运行,但就微观而言,任意时刻,C

    由yh提供
    我们讨论其中的多道程序系统
    多道程序设计技术是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制下,相互穿插运行,两个或两个以上程序在计算机系统中同处于开始到结束之间的状态, 这些程序共享计算机系统资源。与之相对应的是单道程序,即在计算机内存中只允许一个的程序运行。
    对于一个单CPU系统来说,程序同时处于运行状态只是一种宏观上的概念,他们虽然都已经开始运行,但就微观而言,任意时刻,CPU上运行的程序只有一个。
    1. 概念
    程序是在时间上严格有序的指令集。它独占使用系统中的一切资源,包括CPU、内存、外设以及软件等等,没有其他竞争者同它争夺与共享。因此,在单CPU的计算机系统中,一段时间内只有一个程序在运行。程序独占了计算机的全部资源,不受外来影响
    计算机的早期,多任务被称作多道程序。多道程序是指CPU一次读取多个程序放入内存,先运行第一个程序直到它出现了IO操作。因为IO操作慢,CPU需要等待。为了提高CPU利用率,此时运行第二个程序。即,第n+1个程序得以执行的条件是第n个程序进行IO操作或已经运行完毕。这种方式每个程序的时间分配是不均等的,很可能第一个程序运行了几个小时而不出现IO操作,故第二个程序没有运行。在当初,这种情况是令人接受的。人们一次指定运行多个程序,过几个小时或一天后来看运行结果或拿走打印出来的文件。人们不需要实时获得每个程序的运行情况,只关心运行结果。
    多任务处理是指计算机同时运行多个程序的能力。多任务的一般方法是运行第一个程序的一段代码,保存工作环境;再运行第二个程序的一段代码,保存环境;……恢复第一个程序的工作环境,执行第一个程序的下一段代码……现代的多任务,每个程序的时间分配相对平均。
    引入多道程序设计技术的根本目的是为了提高CPU的利用率[1] ,充分发挥计算机系统部件的并行性,现代计算机系统都采用了多道程序设计技术。多道程序设计的出现,加快了现在操作系统的诞生。
    2. 特征
    1)多道:即计算机内存中同时存放几道相互独立的程序。
    2)宏观上并行:同时进入系统的几道程序都处于运行过程中,即它们先后开始了各自的运行,但都未运行完毕。
    3)微观上串行:从微观上看,内存中的多道程序轮流地或分时地占有CPU。
    3. 优点
    提高CPU的利用率。在多道程序环境下,多个程序共享计算机资源当某个程序等待I/O操作时,CPU可以执行其他程序,大大提高CPU的利用率。
    提高设备的利用率。在多道程序环境下,多个程序共享系统的设备,大大提高系统设备的利用率。
    提高系统的吞吐量。在多道程序环境下,减少了程序的等待时间,提高了系统的吞吐量。
    4. 调度
    多道程序处理在内存中可同时装入几个程序,当一个程序因等待外部传输而不能工作下去时,中央处理机马上可以执行另一个程序,若第二个程序又因某种原因不能继续执行时,中央处理机便执行第三个程序,如此继续直至第一个程序外部传输完毕后再执行第一个程序。采用多道程序合理搭配可以提高资源的利用率,增强系统的输入输出能力。多道程序处理是以伪并行方式进行的。从一个时间间隔看,各个程序都已开始执行,但都未执行完毕。从某一瞬间看,在中央处理机中只有一个程序在执行,每个程序占有一个时间片,交替地、串行地使用中央处理机。各道程序并不按它们开始的次序结束。
    多道程序共享处理系统的各种资源,但是系统的资源有限,每道程序要求资源的数量和种类也各不相同,因此多道程序的调度根据每个程序的不同资源要求采用下列策略:①先来先服务,按程序录入顺序建立一个后备队列,由调度程序从头扫描后备队列,找出第一个资源能得到满足的程序,将它插入现行队列等待执行。②按优先数调度,系统挑选优先数最高的程序执行。程序的优先数可以由用户规定(系统对优先数高的程序收取较高的费用),也可由系统决定(系统根据程序的等待时间、运行时间的长短和对系统资源要求的多寡来规定)。这种优先数可以在程序进入系统时确定,也可以在每次程序调度时计算得出。在同一优先数的程序中,仍按先来先服务的原则调度。③均衡调度,把程序按其本身的特性分类,如A类是输入输出费时的程序,B类是输入输出与运算时间均衡的程序,C类为运算费时的程序。程序调度程序轮流地从这些不同类型的程序中挑选运行程序,使资源得到均衡的利用,发挥系统效率并使用户满意。

    摘自 flczzhang的回答
    
    展开全文
  • 分时操作系统和多道程序操作系统的区别  多道程序系统是在计算机内存中同时存放几道相互独立的程序,... 多道程序设计指的是允许多个程序同时进入一个计算机系统的主存储器并启动进行计算的方法。也就是说,计算

    分时操作系统和多道程序操作系统的区别


        多道程序系统是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制之下,相互穿插的运行。 两个或两个以上程序在计算机系统中同处于开始和结束之间的状态。这就称为多道程序技术运行的特征:多道、宏观上并行、微观上串行。

        多道程序设计指的是允许多个程序同时进入一个计算机系统的主存储器并启动进行计算的方法。也就是说,计算机内存中可以同时存放多道(两个以上相互独立的)程序,它们都处于开始和结束之间。从宏观上看是并行的,多道程序都处于运行中,并且都没有运行结束;从微观上看是串行的,各道程序轮流使用CPU,交替执行。引入多道程序设计技术的根本目的是为了提高CPU的利用率,充分发挥计算机系统部件的并行性,现代计算机系统都采用了多道程序设计技术。

        分时操作系统是使一台计算机同时为几个、几十个甚至几百个用户服务的一种操作系统。把计算机与许多终端用户连接起来,分时操作系统将系统处理机时间与内存空间按一定的时间间隔,轮流地切换给各终端用户的程序使用。由于时间间隔很短,每个用户的感觉就像他独占计算机一样。分时操作系统的特点是可有效增加资源的使用率。例如UNIX系统就采用剥夺式动态优先的CPU调度,有力地支持分时操作。

        分时操作系统是给不同用户提供程序的使用,而多道程序系统则是不同程序间的穿插运行。

        总之,分时操作系统主要是针对于多用户来说的,而多道程序系统主要是针对于多程序来说的,注意用户和程序之间的区别。
    展开全文
  • “并发”与“并行”的区别 并发 指两个或多个事件在同一时间间隔内发生,看似都在向前推进; 在微观不是同时执行的,只是把时间分成若干段,使多个进程快速...在单CPU下,微观上多个程序是不可能同时进行的; ...

    “并发”与“并行”的区别

    并发 指两个或多个事件在同一时间间隔内发生,看似都在向前推进;

    • 在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。好比CPU你用完了我接着用,我用完了下一个进程接着用,重在交替。
    • 从宏观外来看,在一段时间内,所有程序都在向前推进,好像是这些进程都在执行。
    • 由于处理器的速度很快,因而从宏观上来看,这些程序都在向前推进,仿佛每个进程都拥有一个属于自己的处理器,即所谓的虚处理器。

    并行 指两个或多个事件在同一时刻内在不同的物理设备上发生;

    • 无论在微观还是宏观上都是在同时进行。
    • 每个事件在同一时刻真正的同时进行。
    • 在单CPU中无法实现进程与进程之间的并行。
    • 可以实现不同物理设备上的并行。

    举个栗子

    • 背景: 将CPU比做成铲子,然后每个进程事件就是人去种树,然后现在有小明和小红都要种一颗小树,假设小明小红的能力属性一致。
    • 种树流程: 拿铲子挖坑 → 丢铲子取树苗 → 拿铲子将树苗种起来。
    • 并发种树: 小明先抢到铲子然后就开始挖坑,小红就在旁边等小明用完铲子。小明挖完坑后把铲子给小红去拿树苗,然后小红就开始拿着铲子挖坑。等小明将树苗拿回来时候也许还需要等一小段时间(一直等到小红把坑挖好,或者她中途不挖坑把铲子丢下去干其他事情),然后小红挖完坑后丢下铲子去拿树苗的时候小明就拿起铲子将树苗种在土里,小明的任务就完成了。小红拿完树苗回来的时候也拿起铲子将树埋起来完成了任务。
    • 并行种树: 有两把铲子,小明和小红同时去挖坑、取树苗和种树,一段时间后小明小红都种完了树。
    • 解释: 并发的种树由于资源的限制只有一把铲子,所以各自只是在不断的换铲子来挖坑种树,在一段时间后两人交替的完成了任务,宏观上看似都在种树。而并行的种树就是真正意义上的同时种树,同时完成任务。

    理解“宏观上并发,微观上串行”

    • 宏观上并发就是指在同一时间段内,CPU高速处理不同任务,看似每个程序都在向前推进。微观上,单CPU中在高速不断的切换进程执行。
    • 比如有A和B两个事件,先在CPU上处理A事件,随后A需要用到输出设备,CPU就开始去执行B事件,然后B需要用到输入设备,CPU又回过来处理A事件,最后处理完A事件后又处理完B。从微观上来讲A和B事件在CPU中是在不断的交替执行的。而在宏观上来看,AB事件都在同时向前推进,仿佛每个事件都有一个专门的处理器。即宏观上并发,微观上交替执行即串行。

    资料参考:

    展开全文
  • 多道程序是作业之间自动调度执行、共享系统资源,并不是真正地同时执行多个作业。 多道程序设计技术是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制下,相互穿插运行,两个或两个以上程序在...
  • 昨日内容回顾 操作系统纸带打孔计算机批处理 —— 磁带 联机 脱机多道操作系统 —— 极大的提高了CPU的利用率 在计算机中 ...在同一时刻 多个程序宏观上的并行分时系统 —— 反而降低了CPU的效率 提高了用户体验 ...
  • 2.3 CPU管理--程序

    2020-05-28 15:28:14
    特征:道、宏观上并行、微观上串行。目的:提高CPU的利用率详解:一进程等待I/O操作的时间与其再内存中停留的时间比为p,当内存中同时有n进程时候,CPU空转的概率为p*p*p...p,np相乘,那么CPU利用率为1-n...
  • 这就称为程序技术运行的特征:道、宏观上并行、微观上串行。 为什么说程序概念得到了中断和通道技术的支持? 采用程序设计减少了CPU时间的浪费,增加了系统吞吐量,提高了系统的效率。为什么引入道...
  • (1)指同时把多个作业放入内存并允许它交替执行,共享系统中的各类资源,当一道程序因某种原因(如I/O请求)而暂停执行时,CPU立即转去执行另一道程序。 (2)会使系统具有多道、宏观上并行、微观上串行的特点,...
  • 对用户而言,宏观上看起来,多个任务同时在执行。而本质而言,在微观上,系统内核中的任务调度器总是在根据特定的调度策略让它们交替运行。系统调度器需要使用任务控制块(TCB)数据结构来管理任务调度功能,TCB被...
  • 1.进程的三大特征: 独立性:拥有自己的独立的地址空间,一个进程不可以直接去访问其他进程的地址...并发是,快速轮换执行,其实上在宏观上多个进程同时进行。 3.线程的特点: 一个线程必须有属于自己的一个父...
  • 进程相关的概念 程序——编译好的二进制文件 ... 一个程序对应多个进程,一个进程对应一个程序 程序没有生命周期,进程有生命周期 单道程序和多道程序 多道——宏观上并行,微观上串行。 进程...
  • COM组件宏观认识

    2019-11-25 16:26:20
    一直搞不清楚COM到底是什么东西,记录一些个人感想,可能很错误的,慢慢消化. 一.宏观认识: 1.COM(组件对象模型)是一种标准,规则,要求,即即于建筑设计指标要求. 2.语言无关性,因为是建立在二进制基础的,也就是...
  • 时间片即CPU分配给各个程序的时间,每个进程被分配一个时间段,称作它的时间片,即该进程允许...在宏观上:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。但在微观上:由于只有一个CPU,一次只能处理程
  • 对用户而言,宏观上看起来,多个任务同时在执行。而本质而言,在微观上,系统内核中的任务调度器总是在根据特定的调度策略让它们交替运行。系统调度器需要使用任务控制块(TCB)数据结构来管理任务调度功能,TCB被...
  • 主要给大家讲解小程序开发的相关知识,让大家在宏观上对向程序开发能有一定的概念。并且讲授的开发环境的搭建让大家对在开发前期做一充分的热身。先激发起大家对线程序开发的热情,这样为下一步小程序的开发学习...
  • 同理,线程也是一样的,从宏观角度理解线程是并行运行的,但是从微观角度分析却是串行运行的,即一个线程一个线程的去运行,当系统只有一个CPU时,线程会以某种顺序执行多个线程,我们把这种情况称之为线程调度。...
  • 结合对一基准体系中的球形均匀裸堆(Bigten)的Keff的蒙特卡罗模拟计算,研究了一种计算核素的平均宏观截面和反应率的方法――用C++编写的MFC程序实现对MCNP输出的中子截面图和中子能谱图的点的坐标所对应的文本...
  • 对用户而言,宏观上看起来,多个任务同时在执行。而本质而言,在微观上,系统内核中的任务调度器总是在根据特定的调度策略让它们交替运行。系统调度器需要使用任务控制块(TCB)数据结构来管理任务调度功能,TCB被...
  • 四、 程序的并发执行

    2020-05-23 16:59:52
    宏观上看是多个程序同时执行,微观上看是多个程序分时占用CPU。这种程序的运行方式为并发执行。 方法执行时的新特征: 间断性:程序在比并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作,致使...
  • 提供的功能的组合,但在字节数组的微观和宏观层面提供了许多附加功能(类似于 Okio 的 )。 主要目标是尽量减少盲目粘贴代码片段的需要 它的主要特点包括: 从各种来源的创造:多个阵列,整体的,随机的字符串,...
  • 写在前面 一篇文章原子性问题的宏观理解 带领大家了解了锁和资源的模型,有了这篇文章的铺垫,相信理解这一篇文章就...如果都是保护单个资源这样简单,程序猿的世界该有美好,可惜并不是,通常我们需要保护...
  • 线程

    2020-12-22 23:26:51
    第9章 多线程 9.1 相关概念 9.1.1 并发与并行(了解) ...在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上多个程序同时运行,这在单 CPU 系统中,每一时刻只能有一个程序执行,即微观上这些程
  • 所谓程序并发性是指在计算机系统中同时存在有多个程序,宏观上看,这些程序是同时向前推进的.在单CPU环境下,这些并发执行的程序是交替在CPU上运行的。分析程序之间的的可并发性,并利用伯恩斯坦条件来判定各程序之间...
  • 第1章从宏观上介绍流处理器演变历史。第2章详解GPU并行机制,深入理解串行与并行程序,以辩证地求解问题。第3章讲解CUDA设备及相关的硬件和体系结构,以实现优CUDA程序性能。第4章介绍CUDA开发环境搭建和可用调试...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,099
精华内容 439
关键字:

多个程序宏观上