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

浏览源代码.

函数

STATIC VOID ShellCmdHwiInfoShow (OsIrqCpupCB *irqData, CPUP_INFO_S *hwiCpup1s, CPUP_INFO_S *hwiCpup10s, CPUP_INFO_S *hwiCpupAll)
 
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi (INT32 argc, const CHAR **argv)
 
 SHELLCMD_ENTRY (hwi_shellcmd, CMD_TYPE_EX, "hwi", 0,(CmdCallBackFunc) OsShellCmdHwi)
 

函数说明

◆ OsShellCmdHwi()

LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi ( INT32  argc,
const CHAR **  argv 
)

在文件 hwi_shellcmd.c88 行定义.

89{
90 UINT32 size;
91
92 (VOID)argv;
93 if (argc > 0) {
94 PRINTK("\nUsage: hwi\n");
95 return OS_ERROR;
96 }
97
98 size = IRQ_CPUP_ALL_INFO_SIZE + IRQ_DATA_SZIE;
99 CHAR *irqCpup = LOS_MemAlloc(m_aucSysMem0, size);
100 if (irqCpup == NULL) {
101 return OS_ERROR;
102 }
103
104 CPUP_INFO_S *hwiCpupAll = (CPUP_INFO_S *)irqCpup;
105 CPUP_INFO_S *hwiCpup10s = (CPUP_INFO_S *)(irqCpup + IRQ_CPUP_INFO_SIZE);
106 CPUP_INFO_S *hwiCpup1s = (CPUP_INFO_S *)(irqCpup + 2 * IRQ_CPUP_INFO_SIZE); /* 2: offset */
107 OsIrqCpupCB *irqData = (OsIrqCpupCB *)(irqCpup + IRQ_CPUP_ALL_INFO_SIZE);
108
109 (VOID)LOS_GetAllIrqCpuUsage(CPUP_ALL_TIME, hwiCpupAll, IRQ_CPUP_INFO_SIZE);
110 (VOID)LOS_GetAllIrqCpuUsage(CPUP_LAST_TEN_SECONDS, hwiCpup10s, IRQ_CPUP_INFO_SIZE);
111 (VOID)LOS_GetAllIrqCpuUsage(CPUP_LAST_ONE_SECONDS, hwiCpup1s, IRQ_CPUP_INFO_SIZE);
112
113 PRINTK(" InterruptNo cpu Count ATime(us) MTime(us) CPUUSE CPUUSE10s CPUUSE1s Mode Name\n");
114 ShellCmdHwiInfoShow(irqData, hwiCpup1s, hwiCpup10s, hwiCpupAll);
115 (VOID)LOS_MemFree(m_aucSysMem0, irqCpup);
116 return 0;
117}
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_GetAllIrqCpuUsage(UINT16 mode, CPUP_INFO_S *cpupInfo, UINT32 len)
获取系统所有中断的历史CPU占用率 指单个中断的CPU占用率,用于表示单个中断在一段时间内的闲忙程度。中断CPU占用率的有效表示范围为0~100, 其精度(可通过配置调整)为百分比。100表示在一段时间...
Definition: los_cpup.c:715
@ CPUP_LAST_TEN_SECONDS
Definition: los_cpup.h:132
@ CPUP_ALL_TIME
Definition: los_cpup.h:134
@ CPUP_LAST_ONE_SECONDS
Definition: los_cpup.h:133
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
Definition: los_memory.c:1123
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 VOID ShellCmdHwiInfoShow(OsIrqCpupCB *irqData, CPUP_INFO_S *hwiCpup1s, CPUP_INFO_S *hwiCpup10s, CPUP_INFO_S *hwiCpupAll)
Definition: hwi_shellcmd.c:48
unsigned int UINT32
Definition: los_typedef.h:57
char CHAR
Definition: los_typedef.h:63
函数调用图:

◆ SHELLCMD_ENTRY()

SHELLCMD_ENTRY ( hwi_shellcmd  ,
CMD_TYPE_EX  ,
"hwi"  ,
,
(CmdCallBackFunc OsShellCmdHwi 
)

◆ ShellCmdHwiInfoShow()

STATIC VOID ShellCmdHwiInfoShow ( OsIrqCpupCB irqData,
CPUP_INFO_S hwiCpup1s,
CPUP_INFO_S hwiCpup10s,
CPUP_INFO_S hwiCpupAll 
)

在文件 hwi_shellcmd.c48 行定义.

50{
51 UINT32 intSave;
52 OsIrqCpupCB *irqDataBase = OsGetIrqCpupArrayBase();
53
54 for (UINT32 i = OS_HWI_FORM_EXC_NUM; i < OS_HWI_MAX_NUM + OS_HWI_FORM_EXC_NUM; i++) {
55 if (!HWI_IS_REGISTED(i)) {
56 continue;
57 }
58
59 intSave = LOS_IntLock();
60 (VOID)memcpy_s(irqData, IRQ_DATA_SZIE, &irqDataBase[i * LOSCFG_KERNEL_CORE_NUM], IRQ_DATA_SZIE);
61 LOS_IntRestore(intSave);
62
63 for (UINT32 cpu = 0; cpu < LOSCFG_KERNEL_CORE_NUM; cpu++) {
64 UINT64 cycles = 0;
65 UINT64 timeMax = 0;
66 OsIrqCpupCB *data = &irqData[cpu];
67 if (data->status == 0) {
68 continue;
69 }
70 UINT32 count = OsGetHwiFormCnt(cpu, i);
71 if (count != 0) {
72 if (data->count != 0) {
73 cycles = (data->allTime * OS_NS_PER_CYCLE) / (data->count * OS_SYS_NS_PER_US);
74 }
75 timeMax = (data->timeMax * OS_NS_PER_CYCLE) / 1000;
76 }
77 CHAR *irqName = OsGetHwiFormName(i);
78 UINT32 index = (i * LOSCFG_KERNEL_CORE_NUM) + cpu;
79 PRINTK(" %10u:%5u%11u%11llu%10llu%6u.%-2u%8u.%-2u%7u.%-2u%7s %-12s\n", i, cpu, count, cycles, timeMax,
80 hwiCpupAll[index].usage / CPUP_PRECISION_MULT, hwiCpupAll[index].usage % CPUP_PRECISION_MULT,
81 hwiCpup10s[index].usage / CPUP_PRECISION_MULT, hwiCpup10s[index].usage % CPUP_PRECISION_MULT,
82 hwiCpup1s[index].usage / CPUP_PRECISION_MULT, hwiCpup1s[index].usage % CPUP_PRECISION_MULT,
83 (g_hwiForm[index].uwParam == IRQF_SHARED) ? "shared" : "normal", (irqName != NULL) ? irqName : "");
84 }
85 }
86}
STATIC INLINE VOID LOS_IntRestore(UINT32 intSave)
Restore interrupts. | 恢复到使用LOS_IntLock关闭所有中断之前的状态
Definition: los_hwi.h:337
STATIC INLINE UINT32 LOS_IntLock(VOID)
Disable all interrupts. | 关闭当前处理器所有中断响应
Definition: los_hwi.h:286
LITE_OS_SEC_TEXT_MINOR OsIrqCpupCB * OsGetIrqCpupArrayBase(VOID)
Definition: los_cpup.c:673
HwiHandleForm g_hwiForm[OS_HWI_MAX_NUM]
中断注册表 @note_why 用 form 来表示?有种写 HTML的感觉
Definition: los_hwi.c:154
CHAR * OsGetHwiFormName(UINT32 index)
Definition: los_hwi.c:169
UINT32 OsGetHwiFormCnt(UINT16 cpuid, UINT32 index)
获取某个中断的中断次数
Definition: los_hwi.c:164
long unsigned int UINT64
Definition: los_typedef.h:66
UINT64 count
Definition: los_cpup_pri.h:64
UINT64 allTime
Definition: los_cpup_pri.h:62
UINT64 timeMax
Definition: los_cpup_pri.h:63
UINT16 status
Definition: los_cpup_pri.h:61
函数调用图:
这是这个函数的调用关系图: