您的位置:首页 > 其它

SOC系统任务调度

2012-07-05 20:10 239 查看
片上系统涉及多核编程和任务调度,任务调度由主控处理器完成,分任务由各个负责的处理器完成。由于没有操作系统管理,没有动态库可用,所以进程进入main函数之前的初始化环境部分需要自己操作。即boot程序。

主控处理器的boot程序主要完成处理器环境的设置,包括ICACHE和DCACHE(哈佛结构的高速缓存)是否打开,IMMU和DMMU(操作系统下的虚拟地址支持部件,完成虚拟地址和物理地址的转换)是否打开,配置中断使能;所有寄存器清0,加载程序到偏上memory(类似于将程序装载到内存);然后进入main函数开始程序的执行。

主控处理器主要完成任务调度,所以没有具体的实际功能,所以在main函数中,首先初始化整个SOC的环境,包括向其他核运送程序、参数、数据等其他核执行任务所需要的资源并启动其他核,包括初始化SOC中硬件加速器的配置。其次,注册中断向量表,主要是一些中断函数的指针,注册之后才能正确的相应中断,执行定义的中断服务程序。最后,初始化主控处理器需要的一些参数,然后进入死循环,等待中断信号的到来做相应的处理。

主控处理器的任务调度主要是由中断服务程序制定的,所以主控处理器的中断机制非常重要。

每一款支持中断的处理器都有几个特殊的逻辑地址用来相应中断和异常,如果对异常不做任何处理,则将其死循环即可,中断产生时需要我们进行处理,一般都会跳转到中断程序的入口地址处(当前地址是中断向量入口地址的地址,执行一条跳转指令,进入到中断向量区。关于为什么跳转?这是因为中断的特殊地址处保留的地址区域比较小)。跳转到中断程序入口地址后,

首先、要关中断(对于不允许嵌套的中断),当然对于允许循环嵌套的就可以不同关闭外部中断。

其次,关中断之后进入中断路由程序,中断路由程序会读取中断路由寄存器(所有中断信号通过这个寄存器请求中断处理)的值,判断出应该进入哪个中断服务程序,

最后、执行清中断和相应的中断处理。



中断产生并且跳转到中断服务程序入口地址的地址完全是硬件实现的,但是在中断服务程序入口地址的地址处所做的操作由程序指定的(boot中)。上面说过,程序跳转到main函数之后会注册中断向量表,中断向量表支持多个中断,对于每个中断保存两个函数指针:一个指向中断清除函数,一个指向中断服务函数,注册的过程,就是创建这样的结构并赋值。基本函数有int int_add(int vec,void(*handle)(void),void(*handle_clear)(void));int int_init(void);int
int_disable(int vec);int int_enable(int vec);int int_mask(int vec);

在中断服务程序中,会配置或者调取信息,查看其它核的任务完成情况,然后,根据结果配置参数,继续其它核的任务调度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: