在嵌入式體系開辟中,C言語常常被用來編程微把持器,如STM32。但是,開辟者們可能會碰到一個成績,那就是時鐘不準。本文將深刻探究C言語中時鐘不準的罕見成績,並供給響應的處理打算。
1. 時鐘不準的罕見成績
1.1 外部時鐘啟動出錯
在利用Proteus模仿STM32時,外部時鐘啟動出錯是一個罕見成績。這會招致時鐘頻率錯誤,進而影響延時函數的正確性。根據[1]中的信息,外部時鐘啟動出錯的原因可能是時鐘頻率設置不當。
1.2 體系時鐘設置錯誤
體系時鐘設置錯誤也是招致時鐘不準的原因之一。比方,在STM32中,假如利用STM32外部時鐘作為體系時鐘,可能會因為時鐘頻率過高而無法牢固任務。
1.3 體系計時器跟調理順序精度成績
體系計時器跟調理順序的精度跟正確性也可能招致時鐘不準。比方,在Java中,System.currentTimeMillis()跟sleep()存在偏差,精度在10ms-15ms之間。
2. 處理打算
2.1 利用STM32外部時鐘
根據[1]中的倡議,利用STM32外部時鐘作為體系時鐘可能處理外部時鐘啟動出錯的成績。具體操縱如下:
// 抉擇HSI作為外部時鐘
void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
Error_Handler();
}
}
2.2 利用System.nanoTime()
在Java中,可能利用System.nanoTime()代替System.currentTimeMillis()來進步時光測量的精度。具體操縱如下:
long startTime = System.nanoTime();
// ... 履行任務 ...
long endTime = System.nanoTime();
long duration = (endTime - startTime) / 1000000L; // 轉換為毫秒
System.out.println("任務履行時光:" + duration + "ms");
2.3 靜態補齊sleep時光
在Java中,可能經由過程靜態補齊sleep時光來保證挪用總數精準。具體操縱如下:
private class VideoRecordThread extends Thread {
final private int spaceArray[] = {32, 33, 35};
private int spaceIndex = 0;
private long lastSpaceTime = 0;
private boolean mState = true;
@Override
public void run() {
while (mState) {
if (spaceIndex > 2) {
spaceIndex = 0;
}
mReadTime = spaceArray[spaceIndex];
doSomething();
long deviation = (System.currentTimeMillis() - lastSpaceTime) - (1000 / 30);
if (deviation > 0) {
try {
Thread.sleep(deviation);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lastSpaceTime = System.currentTimeMillis();
}
}
}
3. 總結
時鐘不準是C言語開辟中罕見的成績,但經由過程公道設置體系時鐘、利用更高精度的計時方法以及靜態補齊sleep時光,可能有效地處理這些成績。盼望本文供給的處理打算能對妳有所幫助。