女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

AT組件的實現過程和代碼的調用邏輯

RT-Thread 操作系統 ? 來源:RT-Thread 操作系統 ? 作者:RT-Thread 操作系統 ? 2022-06-15 09:21 ? 次閱讀

??AT組件的核心處理邏輯是將收到的 AT 模組的應答信息放到 recv_line_buf 緩沖區中,然后每次讀一行數據("\r\n")進行處理,然后判斷屬于哪一類的消息,調用不同的函數。
??本文以 EC200x 模組為例,詳細分析了 AT 組件的實現過程和代碼的調用邏輯,幫助在使用 AT 組件過程中遇到問題的開發者快速定位問題出現的位置。

1 AT 組件

1.1 AT 組件調試信息級別設置

??可以通過修改 env 中的如下內容來控制是否啟用 AT 組件的 debug log 功能,開啟后可以看到日志級別為 debug 的相關日志。使能該選項后將在 `rtconfig.h` 中生成 `#define AT_DEBUG`,AT 組件日志級別的控制是在 `rt-thread/components/net/at/include/at_log.h` 文件中實現的。

RT-Thread Components
 -> Network
   -> AT commands
     -> [*] Enable debug log output  /* 選中表示修改日志級別為 debug */

??特別注意:打開上述功能后,ec200x 線程(在 packages/at_device-2.0.4/class/ec200x/at_device_ec200x.c 文件中由 ec200x_netdev_check_link_status() 函數創建)會提示棧溢出,使用的棧空間約為 1598Bytes,建議將 ec200x_netdev_check_link_status() 函數中的 EC200X_LINK_THREAD_STACK_SIZE 宏更改為 1024 +1024 即 2048 個字節,以解決棧溢出的問題。

pYYBAGKrJimAIo_QAAB49bu49_I566.png使能 AT 調試日志輸出界面

1.2 AT 命令打印使能設置

??在調試時可以通過修改 env 中的如下內容來控制是否使能 AT 組件的收發 AT 指令的顯示,開啟后可以看到每次執行的 AT 指令以及返回的執行結果。

RT-Thread Components
 -> Network
   -> AT commands
       -> [*] Enable print RAW format AT command communication data /* 選中表示打印執行的AT指令 */
poYBAGKrJliAfdEvAAB7AjvEoJM742.png

??上述選項選中后,在執行測試時,打印的 AT 指令示例如下

[D/AT] recvline: 0000-0020: 41 54 0D 0D 0A                                          AT...
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A                                             OK..
[D/AT] sendline: 0000-0020: 41 54 45 30                                             ATE0
[D/AT] recvline: 0000-0020: 41 54 45 30 0D 0D 0A                                    ATE0...
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A                                             OK..
[D/AT] sendline: 0000-0020: 41 54 2B 49 50 52 3F                                    AT+IPR?
01-01 00:40:19 D/at.clnt: execute command (AT+IPR?) timeout (300 ticks)!
[D/AT] recvline: 0000-0020: 0D 0A                                                   ..
[D/AT] recvline: 0000-0020: 2B 49 50 52 3A 20 31 31  35 32 30 30 0D 0A              +IPR: 115200..
[D/AT] recvline: 0000-0020: 0D 0A                                                   ..
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A                                             OK..
[D/AT] recvline: 0000-0020: 0D 0A                                                   ..
[D/AT] recvline: 0000-0020: 52 44 59 0D 0A                                          RDY..
01-01 00:40:22 I/at.dev.ec200x: ec200x device initialize retry...
[D/AT] sendline: 0000-0020: 41 54 45 30                                             ATE0
01-01 00:40:24 D/at.clnt: execute command (ATE0) timeout (300 ticks)!
[D/AT] recvline: 0000-0020: 0D 0A                                                   ..
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A                                             OK..
[D/AT] recvline: 0000-0020: 0D 0A                                                   ..
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A                                             OK..

1.3 GPRS 網絡注冊狀態檢查

??AT組件中會自動創建一個 GPRS 網絡注冊狀態檢查的線程,使用 "AT+CGREG?" 指令進行 GPRS 網絡注冊狀態的檢查,并根據指令返回的結果修改網卡設備的標志位,該指令返回結果中的 等于 1 或者 5,表示模塊已在 UMTS/LTE 網絡注冊上 PS 業務。
??GPRS 網絡注冊狀態檢查線程的名字是模擬網卡的名字,在本例中為 "ec200x",線程的入口函數是 ec200x_check_link_status_entry(packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c),該線程沒間隔 60s 發送一條 AT 指令進行 GPRS 網絡注冊狀態的檢查,并根據返回的結果在函數 netdev_low_level_set_link_status` 中修改 `netdev->flags。各種情況的執行結果分析如下所示

上一次網絡注冊狀態 這次網絡注冊狀態 操作1 操作2
未注冊 未注冊
未注冊 注冊 標記 netdev->flags 的 NETDEV_FLAG_LINK_UP 標志 調用 sal_check_netdev_internet_up() 函數將任務放入 sys_work 隊列,然后通過和 "link.rt-thread.org" 的 8101 端口交互來修改 netdev->flags 中的 NETDEV_FLAG_INTERNET_UP 標志
注冊 未注冊 清除 netdev->flags 的 NETDEV_FLAG_LINK_UP 和 NETDEV_FLAG_INTERNET_UP 標志 調用 netdev_auto_change_default() 函數切換到第一個連接的網絡設備,本例中只用到了一個網絡設
注冊 注冊

??特別注意:GPRS 網絡注冊狀態檢查線程會檢查模組的 power_status,power_status 在 ec200x_init() 函數中默認初始化為 RT_FALSE,然后在名為 "ec200x_net" 的線程的 ec200x_init_thread_entry() 線程入口函數中調用 ec200x_power_on() 函數來修改 power_status 的值。ec200x_power_on() 函數中 power_status 的值修改為 RT_TRUE 依賴于 power_pin 引腳的定義,因此在 env 中必須定義 power_pin 的編號,默認為 -1,定義規則在文件 drivers/drv_gpio.c 中。另外還需要注意的是在代碼中 power_pin 為低電平表示模組處于上電狀態,power_pin 為高電平表示模組處于斷電狀態。
??power_pin 編號的定義在禁用網卡(netdev_set_down)與啟用網卡(netdev_set_up)的實現中也至關重要,網卡的禁用與啟用最終實際調用的函數為 ec200x_power_off() 和 ec200x_power_on(),因此必須定義power_pin 的編號,網卡禁用與啟用的示例代碼如下

/* "ec200x" 名字來源于設備注冊時使用的名字,在文件 packages/at_device-v2.0.4/samples/at_sample_ec200x.c 中定義 */
struct at_device * dev = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, "ec200x");/* 根據名字查找 AT 設備 */
netdev_set_up(dev->netdev);                                                         /* 啟用相應的網卡設備 */
netdev_set_down(dev->netdev);                                                       /* 禁用相應的網卡設備 */

1.4 EC200x 是否能連接外網日志輸出

??rt-thread/components/net/sal_socket/src/sal_socket.c 中 check_netdev_internet_up_work() 函數會自動連接 "link.rt-thread.org"` 的 `8101 端口進行數據收發測試,從而判斷是否可以連接外網。該文件中默認的打印級別為 DBG_INFO,為了方便看出是否可以連接外網,將 check_netdev_internet_up_work() 函數結尾的部分的測試結果打印由 LOG_D 修改為 LOG_I。
??該函數的執行的過程大致為在 ec200x 初始化線程 ec200x_init_thread_entry() 中將將外網檢查任務提交到 sys_work 工作隊列中,系統工作隊列處理線程 _workqueue_thread_entry() 會不斷的檢測是否有需要運行的任務,如果有則執行相應的任務,即執行外網連接檢查任務。外網連接檢查任務提交到工作隊列的執行過程如下

ec200x_init_thread_entry                                                           /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
   |-> ec200x_power_on                                                             /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
   |-> at_obj_exec_cmd()                                                           /* 發送各種AT指令初始化EC200x rt-thread/components/net/at/src/at_client.c */
   |-> ec200x_netdev_set_info                                                      /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
       |-> at_device_get_by_name                                                   /* packages/at_device-v2.0.4/src/at_device.c */
       |-> netdev_low_level_set_status                                             /* rt-thread/components/net/netdev/src/netdev.c */
           |-> netdev->flags |= NETDEV_FLAG_LINK_UP;                               /* 網絡設備的狀態改為連接 */
       |-> netdev_low_level_set_link_status                                        /* rt-thread/components/net/netdev/src/netdev.c */
       |-> netdev_low_level_set_dhcp_status                                        /* rt-thread/components/net/netdev/src/netdev.c */
       |-> netdev_low_level_set_ipaddr                                             /* 設置本地的IP地址 rt-thread/components/net/netdev/src/netdev.c */
           |-> sal_check_netdev_internet_up                                        /* rt-thread/components/net/sal_socket/src/sal_socket.c */
               |-> rt_delayed_work_init(net_work, check_netdev_internet_up_work)   /* 初始化外網連接檢查任務 rt-thread/components/drivers/src/workqueue.c */
                   |-> (&work->work)->work_func = check_netdev_internet_up_work
               |-> rt_work_submit(&(net_work->work), RT_TICK_PER_SECOND);          /* rt-thread/components/drivers/src/workqueue.c */
                   |-> rt_workqueue_submit_work(sys_workq, work, time)             /* 將任務提交到系統工作隊列里面 rt-thread/components/drivers/src/workqueue.c */
       |-> netdev_low_level_set_dns_server                                         /* 設置DNS服務器 rt-thread/components/net/netdev/src/netdev.c */
   |-> ec200x_netdev_check_link_status                                             /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
       |-> rt_thread_create(ec200x_check_link_status_entry)                        /* 線程名字為"ec200x",創建 GPRS 網絡注冊狀態檢查線程 packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
       |-> rt_thread_startup(ec200x_check_link_status_entry)                       /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
/* GPRS 網絡注冊狀態檢查線程 */
ec200x_check_link_status_entry                                                     /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
   |-> ec200x_check_link_status                                                    /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
       |-> at_obj_exec_cmd("AT+CGREG?")                                            /* 發送AT指令檢查網絡狀態 */
   |-> netdev_low_level_set_link_status                                            /* rt-thread/components/net/netdev/src/netdev.c */

??系統工作隊列初始化和任務執行過程如下

rt_work_sys_workqueue_init                                                         /* rt-thread/components/drivers/src/workqueue.c */
   |-> rt_workqueue_create("sys_work")                                             /* 創建系統工作隊列 rt-thread/components/drivers/src/workqueue.c */
       |-> rt_thread_create(_workqueue_thread_entry)                               /* 線程名字為"sys_work",創建隊列線程 rt-thread/components/drivers/src/workqueue.c */
_workqueue_thread_entry                                                            /* 系統工作隊列處理線程 rt-thread/components/drivers/src/workqueue.c */
   |-> if(rt_list_isempty)
       |-> rt_thread_suspend(rt_thread_self());                                    /* 掛起自身 */
       |-> rt_schedule();                                                          /* 任務列表為空,掛起自身,切換線程 */
   |-> rt_hw_interrupt_disable                                                     /* 任務列表不為空,依次往下執行,關閉中斷 */
   |-> rt_list_entry                                                               /* 找到要處理的任務節點 */
   |-> rt_list_remove                                                              /* 將找到的任務節點從任務列表中移除 */
   |-> rt_hw_interrupt_enable                                                      /* 使能中斷 */
   |-> work->work_func(work, work->work_data);                                     /* 執行任務 */

??外網連接檢查任務的執行過程如下

check_netdev_internet_up_work                                                       /* 外網連接檢查任務 rt-thread/components/net/sal_socket/src/sal_socket.c */
   |-> 與 "link.rt-thread.org" 的 8101 端口建立連接,進行收發數據測試
   |-> 打印測試結果
       |-> 收發測試成功  LOG_I("Set network interface device(%s) internet status up.", netdev->name);
           |-> netdev->flags |= NETDEV_FLAG_INTERNET_UP;
       |-> 收發測試失敗  LOG_I("Set network interface device(%s) internet status down.", netdev->name);
           |-> netdev->flags &= ~NETDEV_FLAG_INTERNET_UP;

1.5 AT 設備注冊過程

at_device_register                                                                 /* packages/at_device-v2.0.4/samples/at_sample_ec200x.c */
   |-> class = at_device_class_get(class_id)                                       /* packages/at_device-v2.0.4/src/at_device.c */
   |-> class->device_ops->init(device)                                             /* packages/at_device-v2.0.4/src/at_device.c */
       |-> ec200x_init                                                             /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
           |-> ec200x->power_status = RT_FALSE;                                    /* default power is off.  packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
           |-> ec200x->sleep_status = RT_FALSE;                                    /* default sleep is disabled.  packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
           |-> at_client_init                                                      /* components/net/at/src/at_client.c */
               |-> at_client_para_init                                             /* components/net/at/src/at_client.c */
                   |-> rt_thread_create(client_parser)                             /* 線程名字為"at_clnt0",創建AT解析線程 components/net/at/src/at_client.c */
                       |-> client_parser                                           /* AT解析線程的具體實現 components/net/at/src/at_client.c */
               |-> rt_device_find                                                  /* 尋找串口設備 rt-thread/src/device.c */
               |-> rt_device_open                                                  /* 打開串口設備 rt-thread/src/device.c */
               |-> rt_thread_startup(client->parser)                               /* rt-thread/src/thread.c */
           |-> ec200x_socket_init                                                  /* packages/at_device-v2.0.4/class/ec200x/at_socket_ec200x.c */
           |-> ec200x_netdev_add("ec200x")                                         /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
               |-> netdev_get_by_name("ec200x")                                    /* rt-thread/components/net/netdev/src/netdev.c */
               |-> netdev->ops = &ec200x_netdev_ops;                               /* 網絡設備操作集 packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
               |-> sal_at_netdev_set_pf_info                                       /* rt-thread/components/net/sal_socket/impl/af_inet_at.c */
               |-> netdev_register                                                 /* rt-thread/components/net/netdev/src/netdev.c */
                   |-> netdev->status_callback = RT_NULL;                          /* rt-thread/components/net/netdev/src/netdev.c */
                   |-> netdev->addr_callback = RT_NULL;                            /* rt-thread/components/net/netdev/src/netdev.c */
           |-> ec200x->power_pin                                                   /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
           |-> ec200x->power_status_pin                                            /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
           |-> ec200x->wakeup_pin                                                  /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
           |-> ec200x_netdev_set_up                                                /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
               |-> at_device_get_by_name                                           /* packages/at_device-v2.0.4/src/at_device.c */
               |-> ec200x_net_init                                                 /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
                   |-> rt_thread_create(ec200x_init_thread_entry)                  /* 線程名字為"ec200x_net",執行各種AT指令初始化網絡 packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
                   |-> rt_thread_startup(ec200x_init_thread_entry)                 /* 啟動網絡初始化線程 packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
              |-> netdev_low_level_set_status                                      /* rt-thread/components/net/netdev/src/netdev.c */

1.6 AT 設備類注冊過程

ec200x_device_class_register                                  /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
   |-> ec200x_socket_class_register                           /* packages/at_device-v2.0.4/class/ec200x/at_socket_ec200x.c */
       |-> class->socket_num = AT_DEVICE_EC200X_SOCKETS_NUM;  /* packages/at_device-v2.0.4/class/ec200x/at_socket_ec200x.c */
       |-> class->socket_ops = &ec200x_socket_ops;            /* packages/at_device-v2.0.4/class/ec200x/at_socket_ec200x.c */
   |-> class->device_ops = &ec200x_device_ops;                /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
   |-> at_device_class_register                               /* packages/at_device-v2.0.4/src/at_device.c */

1.7 網卡的啟用與禁用

1.7.1 啟用網卡的執行過程

/* 啟用網卡 */
netdev_set_up(netdev)                                                              /* components/net/netdev/src/netdev.c */
   |-> netdev->ops->set_up(netdev)                                                 /* netdev->ops = &ec200x_netdev_ops; packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
       |-> ec200x_netdev_set_up  ------------------------------|                   /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
       |-> ec200x_net_init                                     |                   /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
           |-> ec200x_init_thread_entry                        |                   /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
                                                               |
/* module init */                                              |
ec200x_init                                                    |                   /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
   |-> at_client_init                                          |                   /* components/net/at/src/at_client.c */
   |-> ec200x_socket_init                                      |                   /* packages/at_device-v2.0.4/class/ec200x/at_socket_ec200x.c */
   |-> ec200x_netdev_add                                       |                   /* packages/at_device-v2.0.4/class/ec200x/at_socket_ec200x.c */
       |-> netdev_register                                     |                   /* rt-thread/components/net/netdev/src/netdev.c */
   |-> ec200x_netdev_set_up  ----------------------------------|                   /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
       |-> ec200x_net_init                                                         /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
           |-> ec200x_init_thread_entry                                            /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */

1.7.2 禁用網卡的執行過程

/* 禁用網卡 */
netdev_set_down(netdev)                                                           /* components/net/netdev/src/netdev.c */
   |-> netdev->ops->set_down(netdev);                                             /* components/net/netdev/src/netdev.c */
       |-> ec200x_netdev_set_down  ----------------------------|                  /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
           |-> ec200x_power_off                                |                  /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
           |-> netdev_low_level_set_status(netdev, RT_FALSE)   |                  /* rt-thread/components/net/netdev/src/netdev.c */
               |-> netdev->flags &= ~NETDEV_FLAG_UP            |                  /* rt-thread/components/net/netdev/src/netdev.c */
               |-> netdev_auto_change_default                  |                  /* rt-thread/components/net/netdev/src/netdev.c */
                                                               |
/* module deinit */                                            |
ec200x_deinit                                                  |                  /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
   |-> ec200x_netdev_set_down  --------------------------------|                  /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */
       |-> ec200x_power_off                                                       /* packages/at_device-v2.0.4/class/ec200x/at_device_ec200x.c */

1.8 socket 編程源碼分析

1.8.1 socket 執行過程

#define socket(domain, type, protocol)  sal_socket(domain, type, protocol)        /* rt-thread/components/net/sal_socket/include/socket/sys_socket/sys/socket.h */
   |-> sal_socket                                                                 /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> socket_new                                                             /* rt-thread/components/net/sal_socket/src/sal_socket.c */
           |-> socket_alloc                                                       /* rt-thread/components/net/sal_socket/src/sal_socket.c */
           |-> sock = st->sockets[idx];                                           /* rt-thread/components/net/sal_socket/src/sal_socket.c */
           |-> sock->socket = idx + SAL_SOCKET_OFFSET;                            /* rt-thread/components/net/sal_socket/src/sal_socket.c */
           |-> sock->magic = SAL_SOCKET_MAGIC;                                    /* rt-thread/components/net/sal_socket/src/sal_socket.c */
           |-> sock->netdev = RT_NULL;                                            /* rt-thread/components/net/sal_socket/src/sal_socket.c */
           |-> sock->user_data = RT_NULL;                                         /* rt-thread/components/net/sal_socket/src/sal_socket.c */
   |-> sal_get_socket                                                             /* rt-thread/components/net/sal_socket/src/sal_socket.c */
   |-> socket_init                                                                /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> sock->netdev = netdev;                                                 /* rt-thread/components/net/sal_socket/src/sal_socket.c */
   |-> SAL_NETDEV_SOCKETOPS_VALID                                                 /* rt-thread/components/net/sal_socket/src/sal_socket.c */
   |-> pf->skt_ops->socket                                                        /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> at_socket                                                              /* rt-thread/components/net/at/at_socket/at_socket.c */
           |-> alloc_socket                                                       /* rt-thread/components/net/at/at_socket/at_socket.c */
           |-> sock->type = socket_type;                                          /* rt-thread/components/net/at/at_socket/at_socket.c */
           |-> sock->state = AT_SOCKET_OPEN;                                      /* rt-thread/components/net/at/at_socket/at_socket.c */
           |-> sock->ops->at_set_event_cb(AT_SOCKET_EVT_RECV, at_recv_notice_cb); /* 設置接收回調函數 rt-thread/components/net/at/at_socket/at_socket.c */
               |-> ec200x_socket_set_event_cb                                     /* packages/at_device-v2.0.4/class/ec200x/at_socket_ec200x.c */
                   |-> at_evt_cb_set[event] = cb;                                 /* packages/at_device-v2.0.4/class/ec200x/at_socket_ec200x.c */
           |-> sock->ops->at_set_event_cb(AT_SOCKET_EVT_CLOSED, at_closed_notice_cb);    /* 設置關閉套接字回調函數 rt-thread/components/net/at/at_socket/at_socket.c */
               |-> ec200x_socket_set_event_cb                                     /* packages/at_device-v2.0.4/class/ec200x/at_socket_ec200x.c */
                   |-> at_evt_cb_set[event] = cb;                                 /* packages/at_device-v2.0.4/class/ec200x/at_socket_ec200x.c */

1.8.2 connect 函數執行過程

#define connect(s, name, namelen)   sal_connect(s, name, namelen)                 /* rt-thread/components/net/sal_socket/include/socket/sys_socket/sys/socket.h */
   |-> sal_connect                                                                /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> SAL_SOCKET_OBJ_GET                                                     /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> SAL_NETDEV_IS_UP                                                       /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> SAL_NETDEV_SOCKETOPS_VALID                                             /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> pf->skt_ops->connect                                                   /* rt-thread/components/net/sal_socket/src/sal_socket.c */
           |-> at_connect                                                         /* rt-thread/components/net/at/at_socket/at_socket.c */
               |-> at_get_socket                                                  /* rt-thread/components/net/at/at_socket/at_socket.c */
               |-> sock->ops->at_connect                                          /* rt-thread/components/net/at/at_socket/at_socket.c */
                   |-> ec200x_socket_connect                                      /* packages/at_device-v2.0.4/class/ec200x/at_socket_ec200x.c *

1.8.3 send 函數執行過程



#define send(s, dataptr, size, flags)               sal_sendto(s, dataptr, size, flags, NULL, NULL) /* rt-thread/components/net/sal_socket/include/socket/sys_socket/sys/socket.h */
#define sendto(s, dataptr, size, flags, to, tolen)  sal_sendto(s, dataptr, size, flags, to, tolen)  /* rt-thread/components/net/sal_socket/include/socket/sys_socket/sys/socket.h */
   |-> sal_sendto                                                                 /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> SAL_SOCKET_OBJ_GET                                                     /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> SAL_NETDEV_IS_UP                                                       /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> SAL_NETDEV_SOCKETOPS_VALID                                             /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> pf->skt_ops->sendto                                                    /* rt-thread/components/net/sal_socket/src/sal_socket.c */
           |-> at_sendto                                                          /* rt-thread/components/net/at/at_socket/at_socket.c */
               |-> at_get_socket                                                  /* rt-thread/components/net/at/at_socket/at_socket.c */
               |-> sock->ops->at_send                                             /* rt-thread/components/net/at/at_socket/at_socket.c */
                   |-> ec200x_socket_send                                         /* packages/at_device-v2.0.4/class/ec200x/at_socket_ec200x.c */

1.8.4 recv 函數執行過程


??recv() 函數執行時,EC200x 接收的 URC 函數將數據放到 `recvpkt_list` 中,然后 recv() 函數從 `recvpkt_list` 中取出數據。

#define recv(s, mem, len, flags)                    sal_recvfrom(s, mem, len, flags, NULL, NULL)    /* rt-thread/components/net/sal_socket/include/socket/sys_socket/sys/socket.h */
#define recvfrom(s, mem, len, flags, from, fromlen) sal_recvfrom(s, mem, len, flags, from, fromlen) /* rt-thread/components/net/sal_socket/include/socket/sys_socket/sys/socket.h */
   |-> sal_recvfrom                                                                /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> SAL_SOCKET_OBJ_GET                                                      /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> SAL_NETDEV_IS_UP                                                        /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> SAL_NETDEV_SOCKETOPS_VALID                                              /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> pf->skt_ops->recvfrom                                                   /* rt-thread/components/net/sal_socket/src/sal_socket.c */
           |-> at_recvfrom                                                         /* rt-thread/components/net/at/at_socket/at_socket.c */
               |-> at_get_socket                                                   /* rt-thread/components/net/at/at_socket/at_socket.c */
               |-> at_recvpkt_get(&(sock->recvpkt_list)...)                        /* 從鏈表中獲取數據 rt-thread/components/net/at/at_socket/at_socket.c */
/* EC200x 接收的 URC 函數 */
urc_recv_func                                                                      /* packages/at_device-v2.0.4/class/ec200x/at_socket_ec200x.c */
   |-> recv_buf = (char *) rt_calloc(1, bfsz);                                     /* 申請空間,供 at_recv_pkt 使用,掛載在 rlist 列表中 */
   |-> at_client_obj_recv                                                          /* rt-thread/components/net/at/src/at_client.c */
       |-> at_client_getchar                                                       /* rt-thread/components/net/at/src/at_client.c */
   |-> at_evt_cb_set[AT_SOCKET_EVT_RECV](socket, AT_SOCKET_EVT_RECV, recv_buf, bfsz);    /* packages/at_device-v2.0.4/class/ec200x/at_socket_ec200x.c */
       |-> at_recv_notice_cb                                                       /* rt-thread/components/net/at/at_socket/at_socket.c */
           |-> at_recvpkt_put(&(sock->recvpkt_list), buff, bfsz);                  /* rt-thread/components/net/at/at_socket/at_socket.c */
           |-> pkt->buff = (char *) ptr;                                           /* 將buff指向之前申請到的空間 rt-thread/components/net/at/at_socket/at_socket.c */
           |-> rt_slist_append                                                     /* 掛載到鏈表中 */

1.8.5 closesocket 函數執行過程

#define closesocket(s)  sal_closesocket(s)               /* rt-thread/components/net/sal_socket/include/socket/sys_socket/sys/socket.h */
   |-> sal_closesocket                                   /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> SAL_SOCKET_OBJ_GET                            /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> SAL_NETDEV_SOCKETOPS_VALID                    /* rt-thread/components/net/sal_socket/src/sal_socket.c */
   |-> pf->skt_ops->closesocket                          /* rt-thread/components/net/sal_socket/src/sal_socket.c */
       |-> at_closesocket                                /* rt-thread/components/net/at/at_socket/at_socket.c */
           |-> sock->ops->at_closesocket                 /* rt-thread/components/net/at/at_socket/at_socket.c */
               |-> ec200x_socket_close                   /* packages/at_device-v2.0.4/class/ec200x/at_socket_ec200x.c */
                   |-> free_socket                       /* rt-thread/components/net/at/at_socket/at_socket.c */
                   |-> socket_delete                     /* rt-thread/components/net/sal_socket/src/sal_socket.c */
                   |-> sock = sal_get_socket(socket);    /* rt-thread/components/net/sal_socket/src/sal_socket.c */
                   |-> sock->magic = 0;                  /* rt-thread/components/net/sal_socket/src/sal_socket.c */
                       |-> sock->netdev = RT_NULL;       /* rt-thread/components/net/sal_socket/src/sal_socket.c */
                       |-> socket_free                   /* rt-thread/components/net/sal_socket/src/sal_socket.c */
                           |-> rt_free(sock);            /* rt-thread/src/memheap.c */
                               |-> rt_memheap_free       /* rt-thread/src/memheap.c */

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • AT
    AT
    +關注

    關注

    2

    文章

    194

    瀏覽量

    65804
  • 組件
    +關注

    關注

    1

    文章

    529

    瀏覽量

    18291
  • RT-Thread
    +關注

    關注

    32

    文章

    1368

    瀏覽量

    41498
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    嵌入式遠程過程調用組件--eRPC

    概述 RPC(Remote Procedure call)遠程過程調用。其分為兩部分:遠程過程過程調用。遠程過程是指每臺機器上提供的服務,
    的頭像 發表于 04-06 14:15 ?3046次閱讀

    OptiSystem應用:用MATLAB組件實現振幅調制

    。我們用MATLAB代碼控制電脈沖對光信號的調制過程,通過在MATLAB組件中導入MATLAB代碼實現。整體光路圖如圖1,全局參數如圖2:
    發表于 02-14 09:39

    【原創精選】RT-Thread征文精選技術文章合集

    自動初始化機制AT組件實現過程代碼調用邏輯NO7 專欄作者 :嵌入式物聯網開發簡介:本專欄
    發表于 07-26 14:56

    根據TR600芯片的過程調用設計與硬件實現

    根據TR600芯片的過程調用設計與硬件實現 摘 要:介紹了TR600語音編解碼芯片中過程調用的設計及
    發表于 04-21 16:19 ?1330次閱讀
    根據TR600芯片的<b class='flag-5'>過程</b><b class='flag-5'>調用</b>設計與硬件<b class='flag-5'>實現</b>

    使用Python實現微車違章查詢API調用代碼實例免費下載

    本文檔的主要內容詳細介紹的是使用Python實現微車違章查詢API調用代碼實例免費下載。
    發表于 01-15 09:59 ?12次下載

    使用Python實現游戲APP充值API調用代碼實例

    本文檔的主要內容詳細介紹的是使用Python實現游戲APP充值API調用代碼實例。
    發表于 01-15 11:34 ?38次下載

    如何使用Python實現QQ號碼測吉兇API調用代碼實例免費下載

    本文檔的主要內容詳細介紹的是如何使用Python實現QQ號碼測吉兇API調用代碼實例免費下載。
    發表于 01-16 13:47 ?12次下載

    如何使用Python實現購物比價API調用代碼實例

    本文檔的主要內容詳細介紹的是如何使用Python實現購物比價API調用代碼實例免費下載。
    發表于 01-17 17:11 ?25次下載

    如何使用Python實現老黃歷網開放接口調用代碼實例免費下載

    本文檔的主要內容詳細介紹的是如何使用Python實現老黃歷網開放接口調用代碼實例免費下載。
    發表于 03-07 16:39 ?2次下載

    使用Python實現水質量接口調用代碼實例免費下載

    本文檔的主要內容詳細介紹的是使用Python實現水質量接口調用代碼實例免費下載
    發表于 03-10 16:42 ?10次下載

    使用Python實現全國郵政編碼查詢API調用代碼實例免費下載

    本文檔的主要內容詳細介紹的是使用Python實現全國郵政編碼查詢API調用代碼實例免費下載。
    發表于 03-18 15:19 ?16次下載

    鴻蒙系統逐步跟蹤系統調用實現過程

    本篇通過一張圖和七段代碼詳細說明系統調用的整個過程,代碼一捅到底,直到匯編層再也捅不下去. 先看圖,這里的模式可以理解為空間,因為模式不同運行的棧空間就不一樣.
    的頭像 發表于 04-23 17:38 ?1964次閱讀
    鴻蒙系統逐步跟蹤系統<b class='flag-5'>調用</b><b class='flag-5'>實現</b>全<b class='flag-5'>過程</b>

    系統調用是如何實現的?

    ,分別是syscall和sysret。 syscall使執行邏輯從用戶態切換到內核態,在進入到內核態之后,cpu會從 MSR_LSTAR 寄存器中,獲取處理系統調用內核代碼的起始地址,即上面的 entry_SYSCALL_64。
    的頭像 發表于 02-20 16:46 ?4165次閱讀
    系統<b class='flag-5'>調用</b>是如何<b class='flag-5'>實現</b>的?

    什么是遠程過程調用

    )。 什么是遠程過程調用呢? 那么對于一個聊天系統有int send_information(int friend_id,string msg)這個方法,我們的一個處理邏輯是不是這樣: 調用bool
    的頭像 發表于 11-10 10:10 ?1372次閱讀
    什么是遠程<b class='flag-5'>過程調用</b>

    邏輯組件包括哪些配件

    邏輯組件是計算機系統中用于處理數據和執行指令的硬件部分。它們是計算機的核心,負責執行程序、處理數據和控制其他硬件組件邏輯組件的設計和
    的頭像 發表于 10-15 14:40 ?1171次閱讀