更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_mp.h 文件参考

浏览源代码.

结构体

struct  MpCallFunc
 

类型定义

typedef VOID(* SMP_FUNC_CALL) (VOID *args)
 

枚举

enum  MP_IPI_TYPE { LOS_MP_IPI_WAKEUP , LOS_MP_IPI_SCHEDULE , LOS_MP_IPI_HALT , LOS_MP_IPI_FUNC_CALL }
 核间中断 更多...
 

函数

VOID LOS_MpSchedule (UINT32 target)
 
VOID OsMpWakeHandler (VOID)
 硬中断唤醒处理函数 更多...
 
VOID OsMpScheduleHandler (VOID)
 硬中断调度处理函数 更多...
 
VOID OsMpHaltHandler (VOID)
 硬中断暂停处理函数 更多...
 
UINT32 OsMpInit (VOID)
 
VOID OsMpFuncCall (UINT32 target, SMP_FUNC_CALL func, VOID *args)
 
VOID OsMpFuncCallHandler (VOID)
 OsMpFuncCallHandler
回调向当前CPU注册过的函数 更多...
 

类型定义说明

◆ SMP_FUNC_CALL

typedef VOID(* SMP_FUNC_CALL) (VOID *args)

在文件 los_mp.h58 行定义.

枚举类型说明

◆ MP_IPI_TYPE

核间中断

枚举值
LOS_MP_IPI_WAKEUP 
LOS_MP_IPI_SCHEDULE 

!< 唤醒CPU

LOS_MP_IPI_HALT 

!< 调度CPU

LOS_MP_IPI_FUNC_CALL 

!< 停止CPU

在文件 los_mp.h49 行定义.

49 {
50 LOS_MP_IPI_WAKEUP, ///!< 唤醒CPU
51 LOS_MP_IPI_SCHEDULE, ///!< 调度CPU
52 LOS_MP_IPI_HALT, ///!< 停止CPU
53#ifdef LOSCFG_KERNEL_SMP_CALL
54 LOS_MP_IPI_FUNC_CALL, ///!< 触发CPU的回调函数,这些回调函数都挂到了cpu的链表上
55#endif
MP_IPI_TYPE
核间中断
Definition: los_mp.h:49
@ LOS_MP_IPI_SCHEDULE
!< 唤醒CPU
Definition: los_mp.h:51
@ LOS_MP_IPI_WAKEUP
Definition: los_mp.h:50
@ LOS_MP_IPI_FUNC_CALL
!< 停止CPU
Definition: los_mp.h:54
@ LOS_MP_IPI_HALT
!< 调度CPU
Definition: los_mp.h:52

函数说明

◆ LOS_MpSchedule()

VOID LOS_MpSchedule ( UINT32  target)

在文件 los_mp.h67 行定义.

68{
69 (VOID)target;
70}

◆ OsMpFuncCall()

VOID OsMpFuncCall ( UINT32  target,
SMP_FUNC_CALL  func,
VOID *  args 
)

It is used to call function on target cpus by sending ipi, and the first param is target cpu mask value.

在文件 los_mp.h86 行定义.

87{
88 (VOID)target;
89 if (func != NULL) {
90 func(args);
91 }
92}

◆ OsMpFuncCallHandler()

VOID OsMpFuncCallHandler ( VOID  )

OsMpFuncCallHandler
回调向当前CPU注册过的函数

返回
参见

在文件 los_mp.c182 行定义.

183{
184 UINT32 intSave;
185 UINT32 cpuid = ArchCurrCpuid();//获取当前CPU
186 LOS_DL_LIST *list = NULL;
187 MpCallFunc *mpCallFunc = NULL;
188
189 MP_CALL_LOCK(intSave);
190 while (!LOS_ListEmpty(&g_percpu[cpuid].funcLink)) {//遍历回调函数链表,知道为空
191 list = LOS_DL_LIST_FIRST(&g_percpu[cpuid].funcLink);//获取链表第一个数据
192 LOS_ListDelete(list);//将自己从链表上摘除
193 MP_CALL_UNLOCK(intSave);
194
195 mpCallFunc = LOS_DL_LIST_ENTRY(list, MpCallFunc, node);//获取回调函数
196 mpCallFunc->func(mpCallFunc->args);//获取参数并回调该函数
197 (VOID)LOS_MemFree(m_aucSysMem0, mpCallFunc);//释放回调函数内存
198
199 MP_CALL_LOCK(intSave);
200 }
201 MP_CALL_UNLOCK(intSave);
202}
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node)
Definition: los_list.h:292
LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
Identify whether a specified doubly linked list is empty. | 判断链表是否为空
Definition: los_list.h:321
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
Definition: los_memory.c:1369
UINT8 * m_aucSysMem0
异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
Definition: los_memory.c:107
STATIC INLINE UINT32 ArchCurrCpuid(VOID)
Definition: los_hw_cpu.h:168
Percpu g_percpu[LOSCFG_KERNEL_CORE_NUM]
CPU池,池大小由CPU核数决定
Definition: los_percpu.c:36
unsigned int UINT32
Definition: los_typedef.h:57
SMP_FUNC_CALL func
回调函数地址
Definition: los_mp.h:76
VOID * args
回调函数的参数
Definition: los_mp.h:77
函数调用图:
这是这个函数的调用关系图:

◆ OsMpHaltHandler()

VOID OsMpHaltHandler ( VOID  )

硬中断暂停处理函数

在文件 los_mp.c97 行定义.

98{
99 (VOID)LOS_IntLock();
100 OsPercpuGet()->excFlag = CPU_HALT;//让当前Cpu停止工作
101
102 while (1) {}//陷入空循环,也就是空闲状态
103}
STATIC INLINE UINT32 LOS_IntLock(VOID)
Disable all interrupts. | 关闭当前处理器所有中断响应
Definition: los_hwi.h:286
@ CPU_HALT
cpu in the halt | CPU处于暂停状态
STATIC INLINE Percpu * OsPercpuGet(VOID)
UINT32 excFlag
函数调用图:
这是这个函数的调用关系图:

◆ OsMpInit()

UINT32 OsMpInit ( VOID  )

在文件 los_mp.c214 行定义.

215{
216 UINT16 swtmrId;
217
218 (VOID)LOS_SwtmrCreate(OS_MP_GC_PERIOD, LOS_SWTMR_MODE_PERIOD, //创建一个周期性,持续时间为 100个tick的定时器
219 (SWTMR_PROC_FUNC)OsMpCollectTasks, &swtmrId, 0);//OsMpCollectTasks为超时回调函数
220 (VOID)LOS_SwtmrStart(swtmrId);//开始定时任务
221#ifdef LOSCFG_KERNEL_SMP_CALL
223#endif
224 return LOS_OK;
225}
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT16 swtmrID)
接口函数 启动定时器 参数定时任务ID
Definition: los_swtmr.c:764
VOID(* SWTMR_PROC_FUNC)(UINTPTR arg)
Define the type of a callback function that handles software timer timeout.
Definition: los_swtmr.h:260
LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval, UINT8 mode, SWTMR_PROC_FUNC handler, UINT16 *swtmrID, UINTPTR arg)
创建定时器,设置定时器的定时时长、定时器模式、回调函数,并返回定时器ID
Definition: los_swtmr.c:712
@ LOS_SWTMR_MODE_PERIOD
Definition: los_swtmr.h:233
VOID OsMpCollectTasks(VOID)
MP定时器处理函数, 递归检查所有可用任务
Definition: los_mp.c:105
VOID OsMpFuncCallInit(VOID)
CPU层级的回调模块初始化
Definition: los_mp.c:204
unsigned short UINT16
Definition: los_typedef.h:56
函数调用图:

◆ OsMpScheduleHandler()

VOID OsMpScheduleHandler ( VOID  )

硬中断调度处理函数

在文件 los_mp.c88 行定义.

89{//将调度标志设置为与唤醒功能不同,这样就可以在硬中断结束时触发调度程序。
90 /*
91 * set schedule flag to differ from wake function,
92 * so that the scheduler can be triggered at the end of irq.
93 */
95}
STATIC INLINE VOID OsSchedRunqueuePendingSet(VOID)
函数调用图:
这是这个函数的调用关系图:

◆ OsMpWakeHandler()

VOID OsMpWakeHandler ( VOID  )

硬中断唤醒处理函数

在文件 los_mp.c83 行定义.

84{
85 /* generic wakeup ipi, do nothing */
86}
这是这个函数的调用关系图: