6、如何实现多任务?
只有一个CPU,如何在同一时间实现多个独立程序的运行?要实现多任务,条件是每个任务互相独立。人如何才能独立,有自己的私有财产。任务也一样,如果一个任务有自己的CPU,堆栈,程序代码,数据存储区,那这个任务就是一个独立的任务。(CPU是通过多任务机制获得的,其他的需要你分配)
TIPS:
如果一个任务正在运行某个公共函数时(如Printf), 被另一个高优先级的任务抢占,那么当这个高优先级的任务也调用同一个公共函数时,极有可能破坏原任务的数据。因为两个任务可能共用一套数据。为了防止这种情况发生,常采用两种措施:可重入设计和互斥调用。
可重入函数中所有的变量均为局部变量,局部变量在调用时临时分配空间,所以不同的任务在不同的时刻调用该函数时,它们的同一个局部变量所分配的存储空间并不相同(任务私有栈中),互不干扰。另外,如果可重入函数调用了其他函数,则这些被调用的函数也必须是可重入函数。
实现互斥(独占)访问的方法有关中断,关调度,互斥信号量,计数信号量等。
6.1 一个任务如何拥有自己的程序代码
对于如何实现多任务,首先是程序代码,每个任务的程序代码与函数一样,与51 的裸奔程序一样,每个任务都是一个大循环。然后是数据存储区,由于全局变量是系统共用的,各个任务共享,不是任务私有,所以这里的数据存储区是指任务的私有变量,如何变成私有?局部变量也。编译器是把局部变量保存在栈里的,所以好办,只要任务有个私有的栈就行。
TIPS:
临界资源是一次仅允许一个任务使用的共享资源。每个任务中访问临界资源的那段程序称为临界区。