欧美1区2区3区激情无套,两个女人互添下身视频在线观看,久久av无码精品人妻系列,久久精品噜噜噜成人,末发育娇小性色xxxx

【秋招】嵌入式面試八股文- 軟硬件調(diào)試方法 篇

【秋招】嵌入式面試八股文 - 最全專欄

一、調(diào)試工具與方法

1. 常用調(diào)試工具

  • 硬件調(diào)試器:JTAG、SWD接口調(diào)試器(如ST-Link、J-Link等)
  • 邏輯分析儀:用于觀察數(shù)字信號波形
  • 示波器:用于觀察模擬信號波形
  • 串口調(diào)試助手:通過UART打印調(diào)試信息
  • 仿真器:在開發(fā)初期進(jìn)行軟件仿真

2. 調(diào)試接口對比

JTAG

5線接口,功能全面

復(fù)雜系統(tǒng)調(diào)試,支持邊界掃描

SWD

2線接口,節(jié)省IO

空間受限場景,ARM Cortex系列

UART

簡單易用,只需2線

簡單信息輸出,資源受限場景

3. 常見調(diào)試方法

// 1. 串口打印法
void debug_print(const char* msg) {
    UART_SendString(UART1, msg);
}

// 2. LED指示法
void debug_led_toggle(void) {
    GPIO_ToggleBits(LED_GPIO, LED_PIN);
}

// 3. 邏輯分析法
void debug_signal(void) {
    GPIO_SetBits(DEBUG_GPIO, DEBUG_PIN);    // 置高電平標(biāo)記開始
    // 需要測量時間的代碼
    GPIO_ResetBits(DEBUG_GPIO, DEBUG_PIN);  // 置低電平標(biāo)記結(jié)束
}


二、常見硬件問題調(diào)試

1. 電源問題

  • 癥狀:系統(tǒng)不穩(wěn)定、隨機復(fù)位、無法啟動
  • 調(diào)試方法: 使用示波器測量電源紋波檢查去耦電容是否正確放置測量關(guān)鍵點電壓
// 軟件復(fù)位檢測示例
void check_reset_source(void) {
    if(RCC->CSR & RCC_CSR_PINRSTF) {
        debug_print("PIN Reset occurred\n");
    }
    if(RCC->CSR & RCC_CSR_PORRSTF) {
        debug_print("POR/PDR Reset occurred\n");
    }
    if(RCC->CSR & RCC_CSR_SFTRSTF) {
        debug_print("Software Reset occurred\n");
    }
    if(RCC->CSR & RCC_CSR_IWDGRSTF) {
        debug_print("Independent Watchdog Reset occurred\n");
    }
    if(RCC->CSR & RCC_CSR_WWDGRSTF) {
        debug_print("Window Watchdog Reset occurred\n");
    }
    if(RCC->CSR & RCC_CSR_LPWRRSTF) {
        debug_print("Low Power Reset occurred\n");
    }
    
    // 清除復(fù)位標(biāo)志
    RCC->CSR |= RCC_CSR_RMVF;
}


2. 時鐘問題

  • 癥狀:通信速率異常、定時不準(zhǔn)確
  • 調(diào)試方法: 使用示波器測量時鐘信號檢查晶振周圍電容值驗證PLL配置
// 時鐘配置驗證示例
void verify_clock_config(void) {
    uint32_t sysclk = SystemCoreClock;
    char buffer[50];
    sprintf(buffer, "System Clock: %lu Hz\n", sysclk);
    debug_print(buffer);
    
    // 輸出一個已知頻率的信號用于驗證
    // 配置定時器產(chǎn)生1kHz信號
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = (sysclk/2000) - 1;  // 1kHz
    TIM_TimeBaseStructure.TIM_Prescaler = 1;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    
    // 配置PWM輸出
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = (sysclk/4000);  // 50%占空比
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);
    
    TIM_Cmd(TIM3, ENABLE);
}


3. 通信接口問題

  • 癥狀:通信失敗、數(shù)據(jù)錯誤
  • 調(diào)試方法: 使用邏輯分析儀捕獲通信波形環(huán)回測試驗證接口檢查引腳配置和電平轉(zhuǎn)換
// I2C通信故障診斷示例
void I2C_Diagnostic(void) {
    // 檢查SCL和SDA線是否被拉低
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 臨時配置為輸入,讀取當(dāng)前狀態(tài)
    GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN | I2C_SDA_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(I2C_GPIO, &GPIO_InitStructure);
    
    uint8_t scl_state = GPIO_ReadInputDataBit(I2C_GPIO, I2C_SCL_PIN);
    uint8_t sda_state = GPIO_ReadInputDataBit(I2C_GPIO, I2C_SDA_PIN);
    
    if(!scl_state) {
        debug_print("I2C SCL線被拉低,可能存在總線死鎖\n");
    }
    if(!sda_state) {
        debug_print("I2C SDA線被拉低,可能存在總線死鎖\n");
    }
    
    // 嘗試解鎖總線
    if(!scl_state || !sda_state) {
        I2C_BusRecover();
    }
    
    // 恢復(fù)I2C配置
    I2C_Configuration();
}


三、常見軟件問題調(diào)試

1. 中斷問題

  • 癥狀:中斷不響應(yīng)、中斷處理異常
  • 調(diào)試方法: 檢查中斷優(yōu)先級配置驗證中斷向量表使用GPIO標(biāo)記中斷執(zhí)行
// 中斷延遲測量示例
volatile uint32_t interrupt_latency = 0;

void TIM2_IRQHandler(void) {
    // 測量中斷延遲
    GPIO_SetBits(DEBUG_GPIO, DEBUG_PIN);  // 置高用于測量
    
    if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        
        // 中斷處理代碼
        interrupt_counter++;
        
        // 模擬不同的處理時間
        for(volatile int i = 0; i < interrupt_latency; i++);
    }
    
    GPIO_ResetBits(DEBUG_GPIO, DEBUG_PIN);  // 置低
}

// 測試不同中斷優(yōu)先級的影響
void test_interrupt_priority(void) {
    for(uint8_t prio = 0; prio < 16; prio++) {
        NVIC_SetPriority(TIM2_IRQn, prio);
        interrupt_latency = 1000;  // 設(shè)置處理時間
        
        // 啟動測量
        debug_print("Testing priority: ");
        debug_print_number(prio);
        debug_print("\n");
        
        // 使用邏輯分析儀測量DEBUG_PIN的高電平時間
        delay_ms(1000);  // 給測量留出時間
    }
}


2. 內(nèi)存問題

  • 癥狀:系統(tǒng)崩潰、數(shù)據(jù)損壞、堆棧溢出
  • 調(diào)試方法: 檢查堆棧使用情況內(nèi)存邊界檢查使用內(nèi)存保護(hù)單元(MPU)
// 堆棧使用監(jiān)控示例
#define STACK_SIZE 1024
uint32_t stack_buffer[STACK_SIZE];
uint32_t stack_pattern = 0xDEADBEEF;

void init_stack_monitor(void) {
    // 用特定模式填充堆棧
    for(int i = 0; i < STACK_SIZE; i++) {
        stack_buffer[i] = stack_pattern;
    }
}

uint32_t check_stack_usage(void) {
    uint32_t used = 0;
    
    // 從底部開始檢查,找到第一個被修改的位置
    for(int i = 0; i < STACK_SIZE; i++) {
        if(stack_buffer[i] != stack_pattern) {
            used = STACK_SIZE - i;
            break;
        }
    }
    
    char buffer[50];
    sprintf(buffer, "Stack usage: %lu bytes\n", used * 4);
    debug_print(buffer);
    
    return used * 4;  // 返回字節(jié)數(shù)
}

// 內(nèi)存越界檢測示例
void *safe_malloc(size_t size) {
    // 分配額外空間用于邊界檢查
    uint8_t *ptr = (uint8_t *)malloc(size + 8);
    if(ptr == NULL) return NULL;
    
    // 在內(nèi)存塊前后設(shè)置哨兵值
    uint32_t *head = (uint32_t *)ptr;
    uint32_t *tail = (uint32_t *)(ptr + size + 4);
    *head = 0xAAAAAAAA;
    *tail = 0xBBBBBBBB;
    
    // 返回實際可用內(nèi)存區(qū)域
    return (void *)(ptr + 4);
}

bool check_memory_corruption(void *ptr) {
    if(ptr == NULL) return false;
    
    uint8_t *real_ptr = ((uint8_t *)ptr) - 4;
    uint32_t *head = (uint32_t *)real_ptr;
    
    // 獲取分配的大小(假設(shè)我們有記錄)
    size_t size = get_allocation_size(ptr);
    uint32_t *tail = (uint32_t *)(real_ptr + size + 4);
    
    if(*head != 0xAAAAAAAA || *tail != 0xBBBBBBBB) {
        debug_print("Memory corruption detected!\n");
        return true;
    }
    
    return false;
}


3. 定時器問題

  • 癥狀:定時不準(zhǔn)、PWM異常
  • 調(diào)試方法: 使用示波器測量輸出波形檢查時鐘源和分頻設(shè)置驗證中斷處理時間
// 定時器精度測試示例
volatile uint32_t timer_counter = 0;
volatile uint32_t expected_counter = 0;

void TIM3_IRQHandler(void) {
    if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
        timer_counter++;
    }
}

void test_timer_accuracy(void) {
    // 配置定時器,預(yù)期1ms中斷一次
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 999;  // 1000-1
    TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock/1000000) - 1;

剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買

雙非本,211碩。本碩均為機械工程,自學(xué)嵌入式,在校招過程中拿到小米、格力、美的、比亞迪、海信、??怠⒋笕A、江波龍等offer。八股文本質(zhì)是需要大家理解,因此里面的內(nèi)容一定要詳細(xì)、深刻!這個專欄是我個人的學(xué)習(xí)筆記總結(jié),是對很多面試問題進(jìn)行的知識點分析,專欄保證高質(zhì)量,讓大家可以高效率理解與吸收里面的知識點!掌握這里面的知識,面試絕對無障礙!

全部評論

相關(guān)推薦

評論
點贊
1
分享

創(chuàng)作者周榜

更多
牛客網(wǎng)
??推髽I(yè)服務(wù)