自己電腦做服務(wù)器發(fā)布網(wǎng)站電商營銷推廣有哪些?
本篇文章記錄我在智能車競賽中,對 Infineon_TC264 這款芯片的底層庫函數(shù)的學(xué)習(xí)分析。通過深入地對其庫函數(shù)進(jìn)行分析,C語言深入的知識得以再次在編程中呈現(xiàn)和運(yùn)用。故覺得很有必要在此進(jìn)行記錄分享一下。
?
目錄
?編輯
一、代碼段分析?
NO.1 指向結(jié)構(gòu)體的指針
NO.2 單片機(jī)的FIFO
NO.3 單片機(jī)的DMA?
?NO.4 結(jié)構(gòu)體指針作為函數(shù)的入口參數(shù)
?NO.5 結(jié)構(gòu)體的嵌套使用
NO.6 初探雙核單片機(jī)TC264
一、代碼段分析?
NO.1 指向結(jié)構(gòu)體的指針
在這段代碼中,
motor_t * motor
是一個指向motor_t
結(jié)構(gòu)體的指針。這種寫法表示motor
是一個指針變量,指向類型為motor_t
的結(jié)構(gòu)體變量。通過使用指針,可以在函數(shù)內(nèi)部直接修改結(jié)構(gòu)體的內(nèi)容,而無需傳遞整個結(jié)構(gòu)體的副本,從而節(jié)省內(nèi)存空間并提高效率。在函數(shù)中,通過傳遞
motor
指針作為參數(shù),可以在函數(shù)內(nèi)部訪問和操作該結(jié)構(gòu)體變量的成員。通過指針操作,可以對結(jié)構(gòu)體的成員進(jìn)行讀取或修改,包括調(diào)整電機(jī)的參數(shù)、控制電機(jī)的運(yùn)動等操作。指針作為一種強(qiáng)大的工具,用于在函數(shù)之間傳遞和操作復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如結(jié)構(gòu)體。
NO.2 單片機(jī)的FIFO
在單片機(jī)中,FIFO表示先進(jìn)先出(First In, First Out)的緩沖區(qū)或隊列。FIFO通常用于臨時存儲數(shù)據(jù),以便在處理器和外設(shè)之間傳輸數(shù)據(jù)時進(jìn)行緩沖和調(diào)節(jié)速度。
在單片機(jī)中,FIFO通常是一個硬件模塊,用于暫時存儲數(shù)據(jù)。當(dāng)數(shù)據(jù)被寫入FIFO時,它被放置在FIFO的尾部;而當(dāng)數(shù)據(jù)被讀取時,它從FIFO的頭部被取出,保持了數(shù)據(jù)的順序性。
FIFO的常見用途包括:
通信接口:在串行通信中,FIFO可用于暫存接收到的數(shù)據(jù)或等待發(fā)送的數(shù)據(jù),以便緩解處理器的負(fù)擔(dān)。
DMA(Direct Memory Access):在DMA傳輸中,FIFO可以暫存要傳輸?shù)臄?shù)據(jù),以便DMA控制器按照一定的速率將數(shù)據(jù)傳輸?shù)侥繕?biāo)設(shè)備或內(nèi)存中。
數(shù)據(jù)采集:在數(shù)據(jù)采集系統(tǒng)中,FIFO可用于臨時存儲傳感器數(shù)據(jù),以便后續(xù)處理。
多任務(wù)處理:在實時系統(tǒng)中,FIFO可用于處理不同優(yōu)先級任務(wù)之間的數(shù)據(jù)傳輸,確保數(shù)據(jù)按照先進(jìn)先出的原則進(jìn)行處理。
NO.3 單片機(jī)的DMA?
DMA(Direct Memory Access)是單片機(jī)中的一種數(shù)據(jù)傳輸方式,它允許外設(shè)直接和內(nèi)存之間進(jìn)行數(shù)據(jù)傳輸,而無需通過中央處理器(CPU)的干預(yù)。
在傳統(tǒng)的數(shù)據(jù)傳輸方式中,CPU負(fù)責(zé)從外設(shè)讀取數(shù)據(jù),并將數(shù)據(jù)寫入內(nèi)存,或者從內(nèi)存讀取數(shù)據(jù)并將數(shù)據(jù)發(fā)送到外設(shè)。這種方式會占用CPU的時間和資源,限制了系統(tǒng)的性能和效率。
而DMA可以解決這個問題。DMA控制器作為一個獨(dú)立的硬件模塊,可以直接訪問內(nèi)存,并與外設(shè)進(jìn)行數(shù)據(jù)傳輸,而不需要CPU的介入。
使用DMA傳輸數(shù)據(jù)的基本過程如下:
配置DMA控制器:首先,需要配置DMA控制器,包括設(shè)置數(shù)據(jù)傳輸?shù)姆较?#xff08;從外設(shè)到內(nèi)存,或從內(nèi)存到外設(shè))、源地址和目的地址、傳輸數(shù)據(jù)的大小等參數(shù)。
啟動DMA傳輸:一旦DMA控制器配置完成,可以啟動DMA傳輸。DMA控制器開始從外設(shè)讀取數(shù)據(jù)或向外設(shè)寫入數(shù)據(jù),直接與內(nèi)存進(jìn)行數(shù)據(jù)交換,而不需要CPU的介入。
完成DMA傳輸:當(dāng)DMA傳輸完成后,DMA控制器會發(fā)出中斷信號,通知CPU數(shù)據(jù)傳輸已經(jīng)完成。
通過使用DMA,單片機(jī)可以在不占用CPU資源的情況下進(jìn)行高速的數(shù)據(jù)傳輸。這對于需要高效處理大量數(shù)據(jù)的應(yīng)用非常有用,如音頻、視頻處理,以及高速通信等。
需要注意的是,DMA的具體實現(xiàn)和功能會因單片機(jī)型號和廠商而異。因此,在使用DMA時,需參考所使用單片機(jī)的技術(shù)手冊和相關(guān)資料,了解具體的配置和操作方法。
?NO.4 結(jié)構(gòu)體指針作為函數(shù)的入口參數(shù)
這段代碼是用來初始化一個電機(jī)的函數(shù)。它接受一個指向 motor_t 結(jié)構(gòu)體的指針作為參數(shù),并使用該結(jié)構(gòu)體中的信息來初始化電機(jī)的GPIO、編碼器和PWM等部分。
首先,它調(diào)用 gpio_init 函數(shù)來初始化電機(jī)的使能引腳(EN_pin),然后調(diào)用 encoder_quad_init 函數(shù)來初始化電機(jī)的編碼器,接著調(diào)用 pwm_init 函數(shù)來初始化電機(jī)的PWM信號,最后調(diào)用 gpio_init 函數(shù)來初始化電機(jī)的方向控制引腳(DIR_pin)。
在這段代碼中,假設(shè) motor_t 結(jié)構(gòu)體包含了所有必要的信息來初始化電機(jī)所需的各個部分,而這些信息則通過 motor 指針傳遞進(jìn)來。
?NO.5 結(jié)構(gòu)體的嵌套使用
這段代碼是對 motor_t 結(jié)構(gòu)體變量 motor_xia 進(jìn)行初始化賦值。
?
NO.6 初探雙核單片機(jī)TC264
雙核單片機(jī)相對于單核單片機(jī)來說,具有以下區(qū)別:
性能更強(qiáng):雙核單片機(jī)擁有兩個處理核心,可以同時運(yùn)行多個任務(wù),提高處理性能和效率。
更高的可靠性:雙核單片機(jī)可以實現(xiàn)雙核熱備份,一旦一個核心出現(xiàn)問題,另一個核心可以繼續(xù)工作,提高系統(tǒng)的穩(wěn)定性和可靠性。
更靈活的應(yīng)用:雙核單片機(jī)可以將不同的任務(wù)分配給不同的核心處理,實現(xiàn)并行處理,適用于復(fù)雜的應(yīng)用場景。
總的來說,雙核單片機(jī)相比于單核單片機(jī)在性能、可靠性和應(yīng)用方面都有明顯的優(yōu)勢,適合需要更高處理性能和穩(wěn)定性要求的應(yīng)用場景。
雙核單片機(jī)的設(shè)計通常會考慮到避免核心之間的沖突。在設(shè)計上,雙核單片機(jī)通常會采用獨(dú)立的緩存系統(tǒng)、總線結(jié)構(gòu)等來確保兩個核心能夠獨(dú)立運(yùn)行而不會相互干擾。
此外,軟件開發(fā)人員在編寫應(yīng)用程序時也需要注意避免核心之間的沖突。他們可以通過合理分配任務(wù)、使用同步機(jī)制等方式來確保雙核系統(tǒng)的穩(wěn)定運(yùn)行,避免核心之間的競爭和沖突。
在雙核系統(tǒng)中,同一個變量在不同核心中運(yùn)行時,最終的值可能會取決于具體的情況和系統(tǒng)設(shè)計。由于每個核心都有自己的寄存器和緩存,可能會導(dǎo)致變量的值在兩個核心之間發(fā)生不同步。
如果在雙核系統(tǒng)中需要多個核心之間共享變量,并且需要保證變量的一致性,通常需要使用同步機(jī)制來確保數(shù)據(jù)的一致性,比如使用鎖、信號量、互斥量等。這樣可以避免出現(xiàn)數(shù)據(jù)競爭和不一致的情況,保證變量的最終值是符合預(yù)期的。
因此,要確保在雙核系統(tǒng)中對同一個變量進(jìn)行操作時能夠得到正確的結(jié)果,開發(fā)人員需要特別注意同步機(jī)制的使用,以避免數(shù)據(jù)競爭和不確定性的情況發(fā)生。
?如何進(jìn)行同步機(jī)制呢?
在雙核系統(tǒng)中,可以采用以下幾種常見的同步機(jī)制來確保對共享變量的操作是有序且正確的:
鎖(Lock):使用鎖機(jī)制可以確保在一個核心執(zhí)行某段代碼時,其他核心無法同時執(zhí)行該段代碼。常見的鎖包括互斥鎖(Mutex)和自旋鎖(Spinlock),可以根據(jù)具體需求選擇適合的鎖類型。
信號量(Semaphore):信號量是一種計數(shù)器,用于控制多個核心對共享資源的訪問。核心在訪問共享資源之前需要先獲取信號量,如果信號量計數(shù)為0,則核心會被阻塞,直到其他核心釋放信號量。
互斥量(Mutex):互斥量是一種特殊的鎖,用于保護(hù)共享資源的訪問。只有獲取到互斥量的核心才能訪問共享資源,其他核心需要等待互斥量釋放后才能進(jìn)行訪問。
條件變量(Condition Variable):條件變量用于實現(xiàn)核心之間的等待和喚醒機(jī)制。一個核心可以等待某個條件滿足后再繼續(xù)執(zhí)行,而其他核心可以在滿足條件時通知等待的核心繼續(xù)執(zhí)行。
這些同步機(jī)制可以根據(jù)具體的應(yīng)用場景和需求選擇使用。在代碼編寫中,需要謹(jǐn)慎地使用同步機(jī)制,確保正確地獲取和釋放鎖、信號量等,以避免死鎖和競態(tài)條件等問題的發(fā)生。此外,一些雙核單片機(jī)芯片也提供了特定的硬件支持來簡化同步操作的實現(xiàn),可以根據(jù)具體芯片的文檔進(jìn)行使用和配置。
如何在雙核系統(tǒng)中使用互斥鎖(Mutex)來對共享資源進(jìn)行加鎖和解鎖操作?
#include <stdio.h>
#include <pthread.h>// 定義共享資源
int shared_resource = 0;// 定義互斥鎖
pthread_mutex_t mutex;// 線程函數(shù)1,對共享資源遞增
void *thread_func1(void *arg) {for (int i = 0; i < 1000000; i++) {// 加鎖pthread_mutex_lock(&mutex);shared_resource++;// 解鎖pthread_mutex_unlock(&mutex);}return NULL;
}// 線程函數(shù)2,對共享資源遞減
void *thread_func2(void *arg) {for (int i = 0; i < 1000000; i++) {// 加鎖pthread_mutex_lock(&mutex);shared_resource--;// 解鎖pthread_mutex_unlock(&mutex);}return NULL;
}int main() {pthread_t thread1, thread2;// 初始化互斥鎖pthread_mutex_init(&mutex, NULL);// 創(chuàng)建線程1pthread_create(&thread1, NULL, thread_func1, NULL);// 創(chuàng)建線程2pthread_create(&thread2, NULL, thread_func2, NULL);// 等待線程結(jié)束pthread_join(thread1, NULL);pthread_join(thread2, NULL);// 銷毀互斥鎖pthread_mutex_destroy(&mutex);// 打印共享資源的最終值printf("Final value of shared_resource: %d\n", shared_resource);return 0;
}
在上面的代碼中,通過創(chuàng)建兩個線程并分別對共享資源進(jìn)行遞增和遞減操作,使用互斥鎖來保護(hù)共享資源的訪問。在每個線程對共享資源進(jìn)行操作之前,先調(diào)用
pthread_mutex_lock()
加鎖,操作完成后再調(diào)用pthread_mutex_unlock()
解鎖。這樣可以確保同一時刻只有一個線程可以訪問共享資源,避免數(shù)據(jù)競爭和不一致性的問題。?