SMP使用参考

Version 1.1


1. SMP说明

当前提供的SDK中每个product config均开启了SMP功能,可根据相关选项CONFIG_CPU_HOTPLUG_SUPPORT = TRUECONFIG_HW_CORE_NUM = 2CONFIG_CORE_NUM = 2CONFIG_HW_TO_LOGICAL_CORE_ID_MAP = 0,1来确定。目前用户无法通过mak配置修改决定是否开启SMP,但可以在代码中指定相应的任务绑定在哪个核上运行,实现单核任务的运行。


2. 绑核操作

  • 包含头文件cam_os_wrapper.h

  • 在用户使用CamOsThreadCreate创建任务后,可使用CamOsThreadSetAffinity这个接口来指定任务在哪个核上运行,以下做个简单的示例:

    CamOsThreadCreate(pstTaskHandle, &tAttr, (void *)task_handle, NULL);
    
    MI_U32 affinity = 0;
    affinity = (1 << 0);// bind core0
    //affinity = (1 << 1);// bind core1
    CamOsThreadSetAffinity(*pstTaskHandle, (const CamOsCpuMask_t *)&affinity);
    
  • 可通过提供的taskstat命令,找到创建的任务,在相应行查看AFFI的值来确定当前绑定在哪个核上。AFFI为0x01表示绑定在核0,0x02表示绑定在核1,0xFF表示均有运行。PerCPU表示对应核上的任务占用率。CPU表示多个核加起来任务占用率,最大为N*100.0,N表示当前共有几个核。


3. SMP影响

  • 由于核间切换导致线程的栈开销变大,所以出现原本单核可以运行的线程,加入smp功能后出现stack over flow,将对应线程的栈加大即可解决

  • core1和core0是同时进行的,所以对共同资源(内存)需要进行锁保护。

  • 强转导致非法内存访问的问题,测试时遇到int强转为float出现非法内存访问。

  • 系统内存占用加大,实测开启SMP与不开启SMP时通过memstat对比系统内存相差1MB。