新闻中心

EEPW首页>物联网与传感器>设计应用> 多核处理器下智能车载平台的设计与实现

多核处理器下智能车载平台的设计与实现

——
作者:卢朝洪 金曦 唐岳东 杨国青 时间:2013-06-26 来源:电子产品世界 收藏

  初始化页表

本文引用地址://m.amcfsurvey.com/article/146841.htm

  在OMAP4430硬件平台上,同构的两个处理器内核共享同一个硬件MMU资源,因此在基于Linux的驱动源码初始化MMU硬件后,整个系统都运行在虚拟地址模式下,接下来MMU模块调用__create_page_table创建了整个系统的临时页表。然后程序跳转至Linux内核入口函数start_kernel()处,在该函数中启用SMP,在SMP模块的__cpu_up函数中插入创建SmartOSEK OS页表的操作osek_setup_pgd()。最后,在start_kernel中调用自定义的函数osek_mm_init(),对临时页表中SmartOSEK OS对应的区块进行重映射,分配一个新的物理地址空间,改写页表将新分配的物理地址对应于该段虚拟地址,使得SmartOSEK OS物理内存对Android内核不可见,从而完成了二者内存资源的相互隔离。

  创建中断向量

  在系统初始化后,大部分的硬件外设资源都将分配到对应的操作系统中的中断向量表中。对于Android OS在cpu0完成系统初始化后,系统就只生成Android OS私有资源对应的中断向量表。而在SmartOSEK OS中,中断向量表是针对于物理地址模式的,需要在MMU设备映射函数中增加申请一页空间作为SmartOSEK OS中断向量表,并将其入口的逻辑地址临时定为0xffff8000。通过osek_setup_pgd()函数拷贝临时页表后,需要将中断向量表所属的页表进行重新映射为0xffff0000,以满足硬件平台的要求。最后在异常向量初始化函数kuser_get_tls_init的最后调用自定义函数osek_setup_vectors(),将SmartOSEK OS物理地址模式下的中断向量表osek_vectors拷贝到新建的实时内核中断向量表中。

  设置系统入口

  在完成资源分区后,主核cpu0触发核间中断启动第二个核cpu1。为了将实时内核SmartOSEK OS绑定到cpu1上,需要将cpu1的运行入口,即cpu1响应主核核间中断的处理函数更改为SmartOSEK OS的入口函数。因此需要改写相应的函数secondary_start_kernel(),调用osek_entry()启动SmartOSEK OS。并在osek_entry()中初始化cpu1私有定时器资源。

  内核间通信

  在共享内存空间上划分出三段连续的空间分别用于同步数据缓冲区和两个方向上异步通信的消息队列。如图3所示。src字段为消息的发送方执行实体的ID,dest字段为消息接受方处理实体的ID。size字段为消息的有效长度。msg字段为消息的内容。共享内存是通过静态分配实现的,同步消息缓冲区和异步消息队列一条消息的最大长度和队列大小等信息需要静态配置。  

  通过核间中断的方式实现通信的双方信号的发送。在主核cpu0上注册四个新的核间中断。前两二个中断用于发送方触发信号通知接收方数据发送完成;后两个中断用于同步数据时,Android向SmartOSEK发出的同步发送信号,以及SmartOSEK接收完成数据后发出的反馈信号。当发生核间中断时,中断处理函数osek_handle_IPI()判断当前触发的核间中断类型并调用相应的响应函数。

平台验证

  对于分区功能,主要测试Android OS和SmartOSEK OS能够正确启动,二者能够分别运行在两个处理器上并访问各自的私有资源,正确响应对应资源相关的中断而互不干扰。图4为系统运行时通过串口打印的部分log信息,此时SmartOSEK周期性地调用任务4到任务0,Android执行其他初始化的工作。  

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭