應(yīng)用層函數(shù)調(diào)用流程分析以-串口為例
1.rt_device_find調(diào)用流程
RTT內(nèi)部有一個(gè)全局變量數(shù)組rt_object_container數(shù)組的數(shù)量就是 rt_object_info_type 內(nèi)核對(duì)象的種類,其中包含一個(gè)RT_USING_DEVICE (設(shè)備的數(shù)據(jù)類型),數(shù)組內(nèi)部的每一個(gè)變量包含一個(gè)鏈表,鏈表內(nèi)部就構(gòu)造了一個(gè)設(shè)備鏈表,rt_device_find函數(shù)就是在這個(gè)數(shù)組內(nèi)部根據(jù)類型找到鏈表,然后在鏈表內(nèi)部根據(jù)設(shè)備名字找到rt_device_t設(shè)備
RTT內(nèi)核對(duì)象存儲(chǔ)結(jié)構(gòu),
struct rt_object_information
{
enum rt_object_class_type type; / < object class type 比如線程類型,外部設(shè)備類型,信號(hào)量類型 /
rt_list_t object_list; / < object list每個(gè)類型的設(shè)備形成為一個(gè)鏈表 */
rt_size_t object_size; /*< object size 每個(gè)類型的鏈表item數(shù)量 */
};
2.設(shè)備打開rt_device_open
rt_device_open 首先是調(diào)用init函數(shù),然后調(diào)用open函數(shù)
init 內(nèi)部再次調(diào)用串口的configure函數(shù)
open內(nèi)部根據(jù)flag的類型,分別申請(qǐng)發(fā)送接收緩存rt_malloc,配置發(fā)送接收硬件serial->ops->control,如果配置的dma,則使用serial->ops->control配置打開dma。
3.rt_device_set_rx_indicate 和rt_device_set_tx_complete函數(shù)調(diào)用流程
這里的2個(gè)函數(shù)都是直接設(shè)置rt_device的rx_indicate 和 tx_indicate
4.rt_device_write 調(diào)用流程分析
rt_device_write 內(nèi)部調(diào)用device->write 函數(shù)也就是 rt_serial_write,內(nèi)部根據(jù)配置串口的發(fā)送方式發(fā)送數(shù)據(jù),是阻塞是dma還是中斷,阻塞和dma都是將數(shù)據(jù)放在緩沖區(qū)內(nèi)部,緩沖區(qū)在中斷和dma部還有臨界區(qū)的保護(hù)
5.rt_device_read 調(diào)用流程分析
rt_device_read內(nèi)部調(diào)用device->read 函數(shù)也就是 rt_serial_read,內(nèi)部根據(jù)配置串口的接收方式接收數(shù)據(jù),是阻塞接收是dma還是中斷接收,阻塞和dma都是將數(shù)據(jù)放在緩沖區(qū)內(nèi)部,緩沖區(qū)在中斷和dma部還有臨界區(qū)的保護(hù)
-
接收機(jī)
+關(guān)注
關(guān)注
8文章
1170瀏覽量
53330 -
dma
+關(guān)注
關(guān)注
3文章
555瀏覽量
100223 -
緩存器
+關(guān)注
關(guān)注
0文章
63瀏覽量
11635 -
串口中斷
+關(guān)注
關(guān)注
0文章
64瀏覽量
13824 -
RTThread
+關(guān)注
關(guān)注
7文章
132瀏覽量
40746
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論