qos_app_api_map.c代码
static _api_qosa_task_sleep_ms_t m_qosa_task_sleep_ms = NULL; void qosa_task_sleep_ms(qosa_uint32_t ms ) { if(NULL ==m_qosa_task_sleep_ms) { int ptr =m_get_api_ptr((char *)__FUNCTION__); if(0 == ptr) { SDK_API_DEBUG_NOTSUP(); return; } m_qosa_task_sleep_ms = ( _api_qosa_task_sleep_ms_t)ptr; } m_qosa_task_sleep_ms(ms); }ql_app_pre_init.c
_get_api_ptr_t m_get_api_ptr = NULL; int qos_app_preboot(void *argv) { qos_app_rw_section_init(); qos_app_zi_section_init(); ql_boot_para *boot_para = (ql_boot_para *)argv; ql_static_mapping* static_mapping = boot_para->static_maping; table_size = *((func_mapping *)boot_para->kernel_maping)->table_size; if(table_size !=0) { m_get_api_ptr=((func_mapping *)boot_para->kernel_maping)->get_fun_ptr_dep_name; } ql_trace = static_mapping->trace; ql_printf = static_mapping->printf; ql_trace("trace test\r\n"); return 1; }unirtos_sys.h
extern void qosa_task_sleep_ms(qosa_uint32_t ms); typedef void (* _api_qosa_task_sleep_ms_t)(qosa_uint32_t ms);ql_open_app_init.h
typedef struct func_map { uint32_t *table_size; void *get_fun_ptr_dep_name; //add system info here }func_mapping;上面代码只贴了跟本文相关的代码片段
里面用到了ptr =m_get_api_ptr((char *)__FUNCTION__),AI解释如下:
先定位两件事:1)m_get_api_ptr 在哪里被“定义/赋值”(函数指针变量最终指向哪个函数);2)你选中那段里 ptr 的具体类型与用法(通过读 qos_app_api_map.c 的对应行)。
Searched regular expressions and read source code
我已经定位到了:m_get_api_ptr 不是一个普通函数,而是一个“函数指针变量”;它在启动预初始化阶段被赋值为“内核侧提供的符号查找函数”。你选中的 ptr 本质上是“查到的目标 API 的函数地址”。
下面把两个问题说清楚:实现在哪里、ptr 表示什么。1) m_get_api_ptr “实现/赋值”在哪里?