1. 基本介绍


__FUNCTION__ 是C语言的一个特殊预定义标识符,它在编译时会被替换为当前函数的名字(字符串常量)。

 __FUNCTION__ 的主要优势:
【1】自动获取函数名 - 无需手动输入,减少错误
【2】代码维护方便 - 函数重命名时自动更新
【3】调试效率高 - 快速定位问题来源
【4】日志信息丰富 - 提供完整的调用上下文

 在嵌入式系统中的实际应用:
【1】 故障诊断 - 快速定位硬件故障位置
【2】性能优化 - 识别瓶颈函数
【3】状态跟踪 - 监控系统运行状态
【4】远程调试 - 通过日志分析现场问题
【5】代码审查 - 理解函数调用关系

 2. 各种用法及示例

 2.1 基本调试打印

include <stdio.h>

void calculate_sum(int a, int b) {
    printf("函数 %s 被调用,参数:%d, %d\n", __FUNCTION__, a, b);
    int result = a + b;
    printf("函数 %s 计算完成,结果:%d\n", __FUNCTION__, result);
}

int main() {
    calculate_sum(5, 3);
    return 0;
}

输出:

函数 calculate_sum 被调用,参数:5, 3
函数 calculate_sum 计算完成,结果:8

2.2 错误处理和日志记录


include <stdio.h>
include <stdlib.h>

define LOG_ERROR(msg) \
    fprintf(stderr, "错误[%s]: %s\n", __FUNCTION__, msg)

int divide(int a, int b) {
    if (b == 0) {
        LOG_ERROR("除数不能为零");
        return 0;
    }
    return a / b;
}

int allocate_memory(int size) {
    void ptr = malloc(size);
    if (ptr == NULL) {
        LOG_ERROR("内存分配失败");
        return -1;
    }
    return 0;
}

int main() {
    divide(10, 0);
    allocate_memory(1000000000);
    return 0;
}

输出:

错误[divide]: 除数不能为零
错误[allocate_memory]: 内存分配失败

2.3 性能分析和函数追踪


include <stdio.h>
include <time.h>

define TRACE_ENTER() \
    printf(">>> 进入函数:%s\n", __FUNCTION__)

define TRACE_EXIT() \
    printf("<<< 退出函数:%s\n", __FUNCTION__)

define TIME_FUNCTION(func_call) \
    do { \
        clock_t start = clock(); \
        func_call; \
        clock_t end = clock(); \
        double duration = (double)(end - start) / CLOCKS_PER_SEC; \
        printf("函数执行时间:%f 秒\n", duration); \
    } while(0)

void process_data() {
    TRACE_ENTER();
    // 模拟耗时操作
    for (int i = 0; i < 1000000; i++);
    TRACE_EXIT();
}

void another_function() {
    TRACE_ENTER();
    printf("正在执行任务...\n");
    TRACE_EXIT();
}

int main() {
    TIME_FUNCTION(process_data());
    TIME_FUNCTION(another_function());
    return 0;
}

输出:

>>> 进入函数:process_data
<<< 退出函数:process_data
函数执行时间:0.005000 秒
>>> 进入函数:another_function
正在执行任务...
<<< 退出函数:another_function
函数执行时间:0.001000 秒

2.4 函数调用链追踪


include <stdio.h>

define MAX_CALL_DEPTH 10
int call_depth = 0;

define ENTER_FUNCTION() \
    do { \
        call_depth++; \
        if (call_depth <= MAX_CALL_DEPTH) { \
            for (int i = 0; i < call_depth; i++) printf("  "); \
            printf("-> %s()\n", __FUNCTION__); \
        } \
    } while(0)

define EXIT_FUNCTION() \
    do { \
        if (call_depth <= MAX_CALL_DEPTH) { \
            for (int i = 0; i < call_depth; i++) printf("  "); \
            printf("<- %s()\n", __FUNCTION__); \
        } \
        call_depth--; \
    } while(0)

void function_c() {
    ENTER_FUNCTION();
    printf("  执行function_c的任务\n");
    EXIT_FUNCTION();
}

void function_b() {
    ENTER_FUNCTION();
    printf("  执行function_b的任务\n");
    function_c();
    EXIT_FUNCTION();
}

void function_a() {
    ENTER_FUNCTION();
    printf("  执行function_a的任务\n");
    function_b();
    EXIT_FUNCTION();
}

int main() {
    ENTER_FUNCTION();
    function_a();
    EXIT_FUNCTION();
    return 0;
}

输出:

-> main()
  -> function_a()
    执行function_a的任务
    -> function_b()
      执行function_b的任务
      -> function_c()
        执行function_c的任务
      <- function_c()
    <- function_b()
  <- function_a()
<- main()

2.5 条件编译和调试级别控制


include <stdio.h>

// 调试级别:0=关闭,1=基本,2=详细,3=全部
define DEBUG_LEVEL 2

if DEBUG_LEVEL >= 1
    define DEBUG_INFO(msg, ...) \
        printf("[INFO][%s] " msg "\n", __FUNCTION__, __VA_ARGS__)
else
    define DEBUG_INFO(msg, ...)
endif

if DEBUG_LEVEL >= 2
    define DEBUG_DETAIL(msg, ...) \
        printf("[DETAIL][%s] " msg "\n", __FUNCTION__, __VA_ARGS__)
else
    define DEBUG_DETAIL(msg, ...)
endif

if DEBUG_LEVEL >= 3
    define DEBUG_VERBOSE(msg, ...) \
        printf("[VERBOSE][%s] " msg "\n", __FUNCTION__, __VA_ARGS__)
else
    define DEBUG_VERBOSE(msg, ...)
endif

void initialize_system() {
    DEBUG_INFO("系统初始化开始");
    DEBUG_DETAIL("分配内存...");
    DEBUG_VERBOSE("内存地址: %p", malloc(100));
    DEBUG_INFO("系统初始化完成");
}

void process_user_input(int input) {
    DEBUG_INFO("处理用户输入: %d", input);
    DEBUG_DETAIL("验证输入有效性...");
    if (input < 0) {
        DEBUG_INFO("输入无效");
    }
}

int main() {
    DEBUG_INFO("程序启动");
    initialize_system();
    process_user_input(42);
    process_user_input(-5);
    DEBUG_INFO("程序结束");
    return 0;
}

输出(DEBUG_LEVEL=2时):

[INFO][main] 程序启动
[INFO][initialize_system] 系统初始化开始
[DETAIL][initialize_system] 分配内存...
[INFO][initialize_system] 系统初始化完成
[INFO][process_user_input] 处理用户输入: 42
[DETAIL][process_user_input] 验证输入有效性...
[INFO][process_user_input] 处理用户输入: -5
[DETAIL][process_user_input] 验证输入有效性...
[INFO][process_user_input] 输入无效
[INFO][main] 程序结束

2.6 状态机函数追踪


include <stdio.h>

typedef enum {
    STATE_IDLE,
    STATE_RUNNING,
    STATE_PAUSED,
    STATE_ERROR
} SystemState;

SystemState current_state = STATE_IDLE;

define STATE_TRANSITION(new_state) \
    do { \
        printf("状态转移 [%s]: %d -> %d\n", \
               __FUNCTION__, current_state, new_state); \
        current_state = new_state; \
    } while(0)

void start_system() {
    if (current_state == STATE_IDLE) {
        STATE_TRANSITION(STATE_RUNNING);
        printf("系统启动成功\n");
    } else {
        printf("当前状态无法启动系统\n");
    }
}

void pause_system() {
    if (current_state == STATE_RUNNING) {
        STATE_TRANSITION(STATE_PAUSED);
        printf("系统已暂停\n");
    }
}

void resume_system() {
    if (current_state == STATE_PAUSED) {
        STATE_TRANSITION(STATE_RUNNING);
        printf("系统恢复运行\n");
    }
}

void error_occurred() {
    STATE_TRANSITION(STATE_ERROR);
    printf("发生错误,系统进入错误状态\n");
}

int main() {
    start_system();
    pause_system();
    resume_system();
    error_occurred();
    return 0;
}

输出:

状态转移 [start_system]: 0 -> 1
系统启动成功
状态转移 [pause_system]: 1 -> 2
系统已暂停
状态转移 [resume_system]: 2 -> 1
系统恢复运行
状态转移 [error_occurred]: 1 -> 3
发生错误,系统进入错误状态

3. 嵌入式系统综合示例

/
  智能温控系统 - 嵌入式综合示例
  功能:控制加热器、风扇、读取温度传感器、记录日志
 /

include <stdio.h>
include <stdint.h>
include <string.h>

// ==================== 模拟硬件接口 ====================
typedef struct {
    uint8_t heater_power;   // 加热器功率 0-100%
    uint8_t fan_speed;      // 风扇速度 0-100%
    float current_temp;     // 当前温度 °C
    float target_temp;      // 目标温度 °C
} SystemController;

// 模拟硬件寄存器
SystemController hw_ctrl = {0};

// ==================== 日志系统 ====================
// 日志级别
typedef enum {
    LOG_LEVEL_ERROR = 1,
    LOG_LEVEL_WARNING = 2,
    LOG_LEVEL_INFO = 3,
    LOG_LEVEL_DEBUG = 4
} LogLevel;

// 当前日志级别(可通过配置修改)
LogLevel current_log_level = LOG_LEVEL_INFO;

// 日志记录宏
define LOG(level, format, ...) \
    do { \
        if ((level) <= current_log_level) { \
            const char level_str; \
            switch(level) { \
                case LOG_LEVEL_ERROR:   level_str = "ERROR"; break; \
                case LOG_LEVEL_WARNING: level_str = "WARNING"; break; \
                case LOG_LEVEL_INFO:    level_str = "INFO"; break; \
                case LOG_LEVEL_DEBUG:   level_str = "DEBUG"; break; \
                default:                level_str = "UNKNOWN"; break; \
            } \
            char log_buffer[128]; \
            snprintf(log_buffer, sizeof(log_buffer), \
                    "[%s][%s] " format "\n", \
                    level_str, __FUNCTION__, __VA_ARGS__); \
            / 实际嵌入式系统中可能输出到串口或SD卡 / \
            printf("%s", log_buffer); \
        } \
    } while(0)

// ==================== 错误处理系统 ====================
define CHECK_TEMP_RANGE(temp) \
    do { \
        if ((temp) < -40.0 || (temp) > 150.0) { \
            LOG(LOG_LEVEL_ERROR, "温度超出范围: %.2f°C", temp); \
            emergency_shutdown(); \
            return -1; \
        } \
    } while(0)

define CHECK_HARDWARE_STATUS() \
    do { \
        if (!is_hardware_ready()) { \
            LOG(LOG_LEVEL_ERROR, "硬件未就绪"); \
            return -2; \
        } \
    } while(0)

// ==================== 性能监控 ====================
ifdef PERFORMANCE_MONITORING
    define PERF_START() \
        uint32_t perf_start_time = get_system_tick()

    define PERF_END(operation_name) \
        do { \
            uint32_t perf_end_time = get_system_tick(); \
            uint32_t perf_duration = perf_end_time - perf_start_time; \
            LOG(LOG_LEVEL_DEBUG, "%s 耗时: %u ms", \
                operation_name, perf_duration); \
        } while(0)
else
    define PERF_START()
    define PERF_END(operation_name)
endif

// ==================== 硬件控制函数 ====================
int set_heater_power(uint8_t power) {
    LOG(LOG_LEVEL_INFO, "设置加热器功率: %d%%", power);
    
    CHECK_HARDWARE_STATUS();
    
    if (power > 100) {
        LOG(LOG_LEVEL_WARNING, "功率值 %d 超过上限,限制为 100%%", power);
        power = 100;
    }
    
    hw_ctrl.heater_power = power;
    
    // 模拟硬件设置
    LOG(LOG_LEVEL_DEBUG, "加热器功率已更新");
    return 0;
}

int set_fan_speed(uint8_t speed) {
    LOG(LOG_LEVEL_INFO, "设置风扇速度: %d%%", speed);
    
    CHECK_HARDWARE_STATUS();
    
    if (speed > 100) {
        LOG(LOG_LEVEL_WARNING, "速度值 %d 超过上限,限制为 100%%", speed);
        speed = 100;
    }
    
    hw_ctrl.fan_speed = speed;
    
    LOG(LOG_LEVEL_DEBUG, "风扇速度已更新");
    return 0;
}

float read_temperature_sensor(int sensor_id) {
    LOG(LOG_LEVEL_DEBUG, "读取传感器 %d", sensor_id);
    
    PERF_START();
    
    // 模拟传感器读取(实际可能是I2C/SPI通信)
    float temp = 25.0 + (sensor_id  0.5);  // 模拟温度
    
    CHECK_TEMP_RANGE(temp);
    
    PERF_END("读取温度传感器");
    
    LOG(LOG_LEVEL_INFO, "传感器 %d 温度: %.2f°C", sensor_id, temp);
    return temp;
}

// ==================== 核心控制逻辑 ====================
void temperature_control_loop(void) {
    LOG(LOG_LEVEL_INFO, "温度控制循环开始");
    
    // 读取所有传感器
    float temp1 = read_temperature_sensor(1);
    float temp2 = read_temperature_sensor(2);
    
    // 计算平均温度
    float avg_temp = (temp1 + temp2) / 2.0;
    hw_ctrl.current_temp = avg_temp;
    
    LOG(LOG_LEVEL_INFO, "平均温度: %.2f°C, 目标温度: %.2f°C", 
        avg_temp, hw_ctrl.target_temp);
    
    // PID控制逻辑(简化版)
    float error = hw_ctrl.target_temp - avg_temp;
    
    if (error > 2.0) {
        // 需要加热
        uint8_t power = (uint8_t)(error  20.0);
        if (power > 100) power = 100;
        set_heater_power(power);
        set_fan_speed(30);  // 低速风扇帮助热交换
    } 
    else if (error < -2.0) {
        // 需要降温
        set_heater_power(0);
        uint8_t speed = (uint8_t)(-error  30.0);
        if (speed > 100) speed = 100;
        set_fan_speed(speed);
    } 
    else {
        // 维持温度
        set_heater_power(20);
        set_fan_speed(20);
        LOG(LOG_LEVEL_INFO, "温度稳定在目标范围内");
    }
    
    LOG(LOG_LEVEL_INFO, "温度控制循环结束");
}

// ==================== 系统管理函数 ====================
int initialize_system(void) {
    LOG(LOG_LEVEL_INFO, "系统初始化开始");
    
    // 初始化硬件
    if (initialize_hardware() != 0) {
        LOG(LOG_LEVEL_ERROR, "硬件初始化失败");
        return -1;
    }
    
    // 设置默认参数
    hw_ctrl.target_temp = 25.0;
    hw_ctrl.heater_power = 0;
    hw_ctrl.fan_speed = 0;
    
    LOG(LOG_LEVEL_INFO, "目标温度设置为: %.2f°C", hw_ctrl.target_temp);
    LOG(LOG_LEVEL_INFO, "系统初始化完成");
    return 0;
}

void set_target_temperature(float temp) {
    LOG(LOG_LEVEL_INFO, "设置目标温度: %.2f°C", temp);
    
    CHECK_TEMP_RANGE(temp);
    
    hw_ctrl.target_temp = temp;
    
    LOG(LOG_LEVEL_INFO, "目标温度已更新");
}

void emergency_shutdown(void) {
    LOG(LOG_LEVEL_ERROR, "紧急关闭系统");
    
    // 关闭所有输出
    hw_ctrl.heater_power = 0;
    hw_ctrl.fan_speed = 0;
    
    LOG(LOG_LEVEL_INFO, "系统已安全关闭");
}

// ==================== 辅助函数(模拟) ====================
int initialize_hardware(void) {
    LOG(LOG_LEVEL_DEBUG, "初始化硬件");
    // 模拟硬件初始化
    return 0;
}

int is_hardware_ready(void) {
    // 模拟硬件状态检查
    return 1;
}

uint32_t get_system_tick(void) {
    // 模拟系统时钟
    static uint32_t tick = 0;
    return tick++;
}

// ==================== 主函数 ====================
int main(void) {
    LOG(LOG_LEVEL_INFO, "智能温控系统启动");
    
    // 初始化系统
    if (initialize_system() != 0) {
        LOG(LOG_LEVEL_ERROR, "系统启动失败");
        return 1;
    }
    
    // 设置目标温度
    set_target_temperature(30.0);
    
    // 运行几个控制循环
    for (int i = 0; i < 3; i++) {
        LOG(LOG_LEVEL_INFO, "========== 控制循环 %d ==========", i + 1);
        temperature_control_loop();
    }
    
    // 改变目标温度
    set_target_temperature(20.0);
    
    // 再运行几个控制循环
    for (int i = 0; i < 2; i++) {
        LOG(LOG_LEVEL_INFO, "========== 控制循环 %d ==========", i + 4);
        temperature_control_loop();
    }
    
    // 测试错误情况
    LOG(LOG_LEVEL_INFO, "========== 测试错误处理 ==========");
    set_target_temperature(200.0);  // 超出范围
    
    LOG(LOG_LEVEL_INFO, "系统运行完成");
    return 0;
}


示例输出:

[INFO][main] 智能温控系统启动
[INFO][initialize_system] 系统初始化开始
[DEBUG][initialize_hardware] 初始化硬件
[INFO][initialize_system] 目标温度设置为: 25.0°C
[INFO][initialize_system] 系统初始化完成
[INFO][set_target_temperature] 设置目标温度: 30.0°C
[INFO][set_target_temperature] 目标温度已更新
[INFO][main] ========== 控制循环 1 ==========
[INFO][temperature_control_loop] 温度控制循环开始
[DEBUG][read_temperature_sensor] 读取传感器 1
[INFO][read_temperature_sensor] 传感器 1 温度: 25.5°C
[DEBUG][read_temperature_sensor] 读取传感器 2
[INFO][read_temperature_sensor] 传感器 2 温度: 26.0°C
[INFO][temperature_control_loop] 平均温度: 25.75°C, 目标温度: 30.0°C
[INFO][set_heater_power] 设置加热器功率: 85%
[DEBUG][set_heater_power] 加热器功率已更新
[INFO][set_fan_speed] 设置风扇速度: 30%
[DEBUG][set_fan_speed] 风扇速度已更新
[INFO][temperature_control_loop] 温度控制循环结束
...
[ERROR][set_target_temperature] 温度超出范围: 200.0°C
[ERROR][emergency_shutdown] 紧急关闭系统
[INFO][emergency_shutdown] 系统已安全关闭

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐