打印

软件时序优化策略

[复制链接]
455|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
4y1b3|  楼主 | 2025-6-25 19:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在嵌入式系统设计中,GD32W515PIQ6 同时运行 WiFi 和 ADC 功能时,软件层面的时序冲突往往是导致 ADC 采样失效的关键原因。本帖将从软件时序优化角度出发,介绍几种有效的策略,实现 ADC 与 WiFi 的稳定共存。
一、时序冲突根源分析
当 WiFi 模块处于数据收发状态时,其会频繁触发中断并占用 SPI 总线资源。而 ADC 的采样过程同样需要稳定的系统资源支持,尤其是在使用 DMA 进行数据传输时,对总线资源的占用更为敏感。若二者时序安排不当,可能出现以下冲突:
总线竞争:WiFi 数据收发与 ADC 采样同时请求 SPI 或 DMA 资源
中断嵌套:高优先级的 WiFi 中断打断 ADC 采样过程
数据同步:ADC 采样时刻与 WiFi 射频发射阶段重叠,引入电磁干扰
二、基于任务调度的时序隔离策略
1. 分时复用机制
通过时间片划分实现 WiFi 与 ADC 的交替工作,避免资源竞争:
c
运行
// 示例代码:分时复用任务调度框架
#define ADC_SAMPLING_TIME_SLOT  20  // ms
#define WIFI_TRANSMIT_TIME_SLOT 30  // ms

void system_task_scheduler(void) {
    static uint8_t task_state = 0;

    switch(task_state) {
        case 0: // ADC采样阶段
            adc_start_sampling();
            delay_ms(ADC_SAMPLING_TIME_SLOT);
            adc_stop_sampling();
            task_state = 1;
            break;

        case 1: // WiFi数据处理阶段
            wifi_process_received_data();
            task_state = 2;
            break;

        case 2: // WiFi数据发送阶段
            wifi_start_transmission();
            delay_ms(WIFI_TRANSMIT_TIME_SLOT);
            wifi_stop_transmission();
            task_state = 0;
            break;
    }
}
2. 优先级反转保护
在 ADC 采样关键阶段提升任务优先级,防止被 WiFi 中断干扰:
c
运行
// 示例代码:关键采样阶段优先级提升
void adc_critical_sampling(void) {
    // 提升当前任务优先级,屏蔽WiFi中断
    task_priority_set(HIGH_PRIORITY);
    eclic_irq_disable(WiFi_IRQn);

    // 执行关键ADC采样操作
    adc_start_conversion();
    while(!adc_conversion_complete());
    adc_read_result();

    // 恢复优先级和中断
    eclic_irq_enable(WiFi_IRQn);
    task_priority_set(NORMAL_PRIORITY);
}
三、基于事件驱动的同步机制
1. 状态机控制
设计状态机实现 WiFi 与 ADC 的协同工作:
c
运行
// 系统状态定义
typedef enum {
    SYSTEM_IDLE,
    ADC_SAMPLING,
    WIFI_TX_RX,
    DATA_PROCESSING
} SystemState;

// 状态机实现
void system_state_machine(void) {
    static SystemState current_state = SYSTEM_IDLE;

    switch(current_state) {
        case SYSTEM_IDLE:
            if(adc_sample_request) {
                current_state = ADC_SAMPLING;
                adc_start();
            } else if(wifi_data_ready) {
                current_state = WIFI_TX_RX;
                wifi_transfer_start();
            }
            break;

        case ADC_SAMPLING:
            if(adc_sampling_complete) {
                current_state = DATA_PROCESSING;
                process_adc_data();
            }
            break;

        case WIFI_TX_RX:
            if(wifi_transfer_complete) {
                current_state = SYSTEM_IDLE;
                process_wifi_data();
            }
            break;

        case DATA_PROCESSING:
            if(data_processing_complete) {
                current_state = SYSTEM_IDLE;
            }
            break;
    }
}
2. 信号量与互斥锁
使用 RTOS 提供的同步机制保护共享资源:
c
运行
// 示例代码:使用FreeRTOS信号量实现同步
SemaphoreHandle_t adc_semaphore;
SemaphoreHandle_t wifi_semaphore;

// ADC任务
void vAdcTask(void *pvParameters) {
    for(;;) {
        // 等待ADC执行许可
        xSemaphoreTake(adc_semaphore, portMAX_DELAY);

        // 执行ADC采样
        adc_start_sampling();

        // 释放WiFi许可
        xSemaphoreGive(wifi_semaphore);
    }
}

// WiFi任务
void vWiFiTask(void *pvParameters) {
    for(;;) {
        // 等待WiFi执行许可
        xSemaphoreTake(wifi_semaphore, portMAX_DELAY);

        // 执行WiFi数据传输
        wifi_transfer_data();

        // 释放ADC许可
        xSemaphoreGive(adc_semaphore);
    }
}
四、动态采样率调整策略
根据 WiFi 活动状态动态调整 ADC 采样率,降低冲突概率:
c
运行
// 示例代码:动态采样率调整
void adjust_adc_sampling_rate(void) {
    if(wifi_is_active()) {
        // WiFi活跃时降低采样率
        adc_set_sampling_rate(LOW_SAMPLING_RATE);
    } else {
        // WiFi空闲时提高采样率
        adc_set_sampling_rate(HIGH_SAMPLING_RATE);
    }
}

// WiFi状态回调函数
void wifi_activity_callback(bool is_active) {
    adjust_adc_sampling_rate();
}


五、实现注意事项
电磁兼容性 (EMC) 考虑:在 WiFi 射频发射阶段暂停 ADC 采样,避免射频干扰
缓冲区设计:为 ADC 和 WiFi 分别设计足够大小的 FIFO 缓冲区,减少实时数据处理压力
延时测量:使用高精度定时器测量 WiFi 和 ADC 操作的执行时间,为时序优化提供依据
看门狗监控:添加系统看门狗,防止因时序冲突导致的程序跑飞
通过合理的软件时序优化,可以有效解决 GD32W515PIQ6 中 ADC 与 WiFi 的共存问题。

使用特权

评论回复
沙发
tpgf| | 2025-6-26 10:44 | 只看该作者
对非实时任务分时执行,避免单任务长时间占用CPU

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

357

帖子

0

粉丝