int a, b, c;float x, y
uint32_t motorRpmCurrent;uint32_t motorRpmTarget;float temperatureSensor;float voltageInput;
// 類型前綴uint8_t u8BufferIndex; // u8表示無符號8位uint16_t u16AdcValue; // u16表示無符號16位float fTemperature; // f表示浮點(diǎn)數(shù)// 作用域前綴static uint32_t s_u32TickCount; // s_表示靜態(tài)變量volatile uint8_t g_u8SystemFlag; // g_表示全局變量
void ProcessData(void){// 讀取ADCadc_value = ADC_Read();// 數(shù)據(jù)處理if(adc_value > 1000) {// 控制電機(jī)Motor_SetSpeed(2000);// 發(fā)送數(shù)據(jù)UART_Send("Motor speed increased");// 更新顯示LCD_Show("Running");}// 還有很多其他操作...}
// 每個(gè)函數(shù)職責(zé)清晰uint16_t ReadAdcValue(void){return ADC_Read();}bool IsAdcValueValid(uint16_t adcValue){return (adcValue > ADC_MIN_VALUE && adcValue < ADC_MAX_VALUE);}void ControlMotorBasedOnAdc(uint16_t adcValue){if(adcValue > ADC_THRESHOLD) {Motor_SetSpeed(MOTOR_HIGH_SPEED);}}
i++; // i加1// 增加循環(huán)計(jì)數(shù)器,用于超時(shí)檢測// 超時(shí)時(shí)間 = counter * 10ms (定時(shí)器周期)timeoutCounter++;
在關(guān)鍵算法處,使用塊注釋解釋設(shè)計(jì)原理:
/*** @brief PID控制器計(jì)算* @param setpoint 設(shè)定值* @param measured 測量值* @param pid PID參數(shù)結(jié)構(gòu)體* @return PID輸出值** 采用位置式PID算法:* output = Kp*e + Ki*∑e + Kd*(e-e_prev)* 避免積分飽和:當(dāng)輸出限幅時(shí)停止積分*/float PID_Calculate(float setpoint, float measured, PID_TypeDef* pid){// 實(shí)現(xiàn)代碼...}
// motor.hextern int a, b, c;void do_something(void);
// motor.hextern "C"{// 電機(jī)狀態(tài)枚舉typedef enum{MOTOR_STOP,MOTOR_RUNNING,MOTOR_ERROR} Motor_State_t;// 電機(jī)控制結(jié)構(gòu)體typedef struct{uint32_t currentRpm;uint32_t targetRpm;Motor_State_t state;} Motor_Handle_t;// 函數(shù)聲明bool Motor_Init(Motor_Handle_t* motor);void Motor_SetSpeed(Motor_Handle_t* motor, uint32_t rpm);Motor_State_t Motor_GetState(const Motor_Handle_t* motor);}
void ReadSensor(void){uint8_t data = I2C_Read(0x48);ProcessData(data); // 如果I2C失敗怎么辦?}
typedef enum {SENSOR_OK,SENSOR_TIMEOUT,SENSOR_CHECKSUM_ERROR,SENSOR_NOT_RESPONDING} Sensor_Status_t;Sensor_Status_t ReadSensor(uint8_t* data){if(data == NULL) {return SENSOR_INVALID_PARAM;}if(I2C_Start() != I2C_OK) {return SENSOR_BUS_BUSY;}HAL_StatusTypeDef status = HAL_I2C_Master_Receive(&hi2c1, 0x48<<1, data, 1, 100);if(status != HAL_OK) {Log_Error("I2C讀取失敗,狀態(tài)碼: %d", status);return SENSOR_READ_ERROR;}return SENSOR_OK;}
// SQUARE(3+2) 會變成 3+2 * 3+2 = 11,而不是25
// 每個(gè)參數(shù)和整個(gè)表達(dá)式都要加括號// 多語句宏用do-while(0)包裹GPIO_TogglePin(ledDelay_ms(50); \} while(0)
// main.cADC_Value = ReadADC();UART_Send(ADC_Value);Display_Show(ADC_Value);Motor_Control(ADC_Value);// 所有功能都寫在主文件中
project/├── drivers/│ ├── adc.c│ ├── uart.c│ └── motor.c├── modules/│ ├── data_processor.c│ └── system_monitor.c├── utils/│ ├── ring_buffer.c│ └── logger.c└── main.c
// 可讀性優(yōu)先uint32_t CalculateAverage(const uint32_t* data, uint32_t size){if(data == NULL || size == 0) {return 0;}uint64_t sum = 0; // 使用64位防止溢出for(uint32_t i = 0; i < size; i++) {sum += data[i];}return (uint32_t)(sum / size);}// 性能關(guān)鍵處適當(dāng)優(yōu)化void FastArrayCopy(uint16_t* dest, const uint16_t* src, uint32_t size){// 使用DMA或32位拷貝(如果地址對齊)if(((uint32_t)dest & 0x3) == 0 && ((uint32_t)src & 0x3) == 0) {uint32_t* dest32 = (uint32_t*)dest;uint32_t* src32 = (uint32_t*)src;for(uint32_t i = 0; i < size/2; i++) {dest32[i] = src32[i];}} else {for(uint32_t i = 0; i < size; i++) {dest[i] = src[i];}}}
// K&R風(fēng)格void function(void) {if(condition) {// code} else {// code}}// Allman風(fēng)格void function(void){if(condition){// code}else{// code}}
// 簡單的單元測試示例void Test_AdcConversion(void){TEST_ASSERT_EQUAL(0, Adc_Init());TEST_ASSERT_TRUE(Adc_Calibrate());uint16_t value = Adc_ReadChannel(ADC_CHANNEL_0);TEST_ASSERT_INT_WITHIN(100, 2048, value); // 允許±100的誤差}
