CPU&OS相关应用
📎 原始文档:https://www.kdocs.cn/l/cgqpb1DwOgHo CPU&OS相关应用
OS
- 实现推送某个函数到指定任务执行
//不带参数的函数
static void callback_func_no_param(void)
{
printf("%s\n", __func__);
}
//带1个参数的函数
static void callback_func_1_param(int mode)
{
printf("%s %d\n", __func__, mode);
bt_set_low_latency_mode(mode);
}
//带2个参数的函数
static void callback_func_2_param(int mode, int eq)
{
printf("%s %d %d\n", __func__, mode, eq);
bt_set_low_latency_mode(mode);
eq_mode_set(eq);
}
//带1个指针参数的函数,可以间接做n个参数的回调
static void callback_func_n_param(int *param)
{
//取出参数
int param_num = param[0];
int mode = param[1];
int eq = param[2];
int vbat = param[3];
printf("%s %d %d %d %d\n", __func__, param_num, mode, eq, vbat);
bt_set_low_latency_mode(mode);
eq_mode_set(eq);
chargestore_set_power_level(vbat);
free(param);
}
//带1个指针参数的函数,传参是内存地址或者字符串地址
static void callback_func_1_pointer(int *pointer)
{
u8 *path = (u8 *)pointer;
printf("%s %x\n", __func__, path);
tone_play(path, 1);
}
//推送某个函数到指定任务(如"app_core")执行
static void func_callback_in_task(void)
{
int err;
int msg[5];
//推送不带参数的函数到app_core任务
msg[0] = (int) callback_func_no_param;
msg[1] = 0;//函数无需参数
err = os_taskq_post_type("app_core", Q_CALLBACK, 2, msg);
//推送带1个参数的函数到app_core任务
msg[0] = (int) callback_func_1_param;
msg[1] = 1;//函数需要1个参数
msg[2] = 0;//对应参数 mode
err = os_taskq_post_type("app_core", Q_CALLBACK, 3, msg);
//推送带2个参数的函数到app_core任务
msg[0] = (int) callback_func_2_param;
msg[1] = 2;//函数需要2个参数
msg[2] = 0;//对应第一个参数 mode
msg[3] = 1;//对应第二个参数 eq
err = os_taskq_post_type("app_core", Q_CALLBACK, 4, msg);
//推送带1个指针参数的函数到app_core任务,参数是指针,可以实现n个参数的等效传参
int *param = malloc(4 * sizeof(int));
param[0] = 3;
param[1] = 0;
param[2] = 1;
param[3] = 55;//申请内存存放要传递的参数
msg[0] = (int) callback_func_n_param;
msg[1] = 1;//函数需要1个参数
msg[2] = (int)param;//对应参数 param
err = os_taskq_post_type("app_core", Q_CALLBACK, 3, msg);
//推送带1个指针参数的函数到app_core任务
msg[0] = (int) callback_func_1_pointer;
msg[1] = 1;//函数需要1个参数
msg[2] = (int)TONE_BT_CONN;//对应参数 pointer
err = os_taskq_post_type("app_core", Q_CALLBACK, 3, msg);
printf("%s %d\n", __func__, err);
}
- 701N系列修改任务运行所在核

- 查看操作系统线程cpu占用率 注意:仅能查询操作系统线程的cpu占用率,此占用率不包含中断占用的cpu时间
可视化SDK:
void printf_os_cpu_usage(void)
{
int usage[2] = { 0, 0 };
extern void CacheReport(void);
CacheReport();
task_info_output(0);//输出各个线程占用率
int a = os_cpu_usage(NULL, usage);
task_info_reset();
printf("cpu0:%d, cpu1:%d\n", usage[0], usage[1]);//输出总占用率
}
普通SDK:
sys_timer_add(NULL, os_system_info_output, 1000);
- 查看当前在哪个线程运行
/* --------------------------------------------------------------------------*/
/**
* @brief 获取当前任务名
*
* @return 当前任务名
*/
/* ----------------------------------------------------------------------------*/
const char *os_current_task();
- 查看RAM内存状态
//打开库打印,调用下面这个函数,就会有ram状态打印出来
void mem_stats(void);
- 如何创建task

CPU
- 判断当前CPU是否处于中断中 判断cpu_in_irq()的返回值,0是不在中断中,非0则在中断中
- 判断当前CPU是否关闭了中断 判断cpu_irq_disabled()的返回值,0是没关中断,非0则关闭了中断