如何动态切换CPU主频
切换时钟的策略
1.配置CPU主频统一在CPU0上(避免多核操作相同的寄存器不同步而出现异常)。
2.CPU选择投频最高的模块的CPU主频。
3.支持CPU0和CPU1调用bk_pm_module_vote_cpu_freq()接口投频,不支持CPU2上调用该接口。
4.启动CPU1时,当前SDK默认把主频升到最高,应用程序可以不用额外再调接口投频。
5.CPU0或CPU1上调接口投频之后,CPU0,CPU1,CPU2的主频和BUS频率都会变化。因为他们的频率是联动的,不是独立的。
支持配置的CPU主频
- 投频后CPU和BUS的频率对应关系:
PM_CPU_FRQ_26M = 0, // 0:CPU1:26M,CPU0:26M,BUS:26M
PM_CPU_FRQ_60M, // 1:CPU1:60M,CPU0:60M,BUS:60M
PM_CPU_FRQ_80M, // 2:CPU1:80M,CPU0:80M,BUS:80M
PM_CPU_FRQ_120M, // 3:CPU1:120M,CPU0:120M,BUS:120M
PM_CPU_FRQ_240M, // 4:CPU1:240M,CPU0:120m,BUS:120M
PM_CPU_FRQ_320M, // 5:CPU1:320M,CPU0:160M,BUS:160M
PM_CPU_FRQ_480M, // 6:CPU1:480M,CPU0:240M,BUS:240M
PM_CPU_FRQ_DEFAULT // default cpu frequency which control by pm module
动态投CPU主频的接口
- bk_err_t bk_pm_module_vote_cpu_freq(pm_dev_id_e module,pm_cpu_freq_e cpu_freq);
module:模块名字(选择一个使用的模块,如果自己新的模块,可以添加)
cpu_freq:需要投的主频
获取当前投的最高CPU主频的接口
pm_cpu_freq_e bk_pm_current_max_cpu_freq_get()
示例:参考以下步骤1和步骤2
步骤1: DISP模块投320M: - bk_pm_module_vote_cpu_freq(PM_DEV_ID_DISP, PM_CPU_FRQ_320M);
步骤2: DISP模块使用完高平后,把自己的模块主频恢复默认: - bk_pm_module_vote_cpu_freq(PM_DEV_ID_DISP, PM_CPU_FRQ_DEFAULT);
备注
投频使用的dev_id和使用完之后的dev_id需要一样,不然会引起错误。使用前可以搜索,确认DEV_ID是其他模块没有其他业务使用