【嵌入式】嵌入式面試題 36 問

1. volatile 是否可以修飾 const

是的,volatile 可以修飾 constconst 表示變量的值不能被修改,而 volatile 表示變量的值可能在程序之外被修改(例如,由硬件修改)。 將 volatile 用于 const 變量意味著該變量的值雖然不能被程序修改,但其值可能會被外部因素改變,編譯器需要每次都從內存中讀取該變量的值,而不是將其優化為緩存中的值。

2. 如何快速一行代碼操作硬件寄存器

這取決于你的硬件架構和編程語言。 假設使用 C 語言,并且已經定義了寄存器的內存地址,可以使用指針進行操作:

*(volatile unsigned int *)0x12345678 = 0xABCD; // 將 0xABCD 寫入地址為 0x12345678 的寄存器

volatile 關鍵字至關重要,它確保每次訪問都直接訪問內存,而不是使用緩存中的值。 0x12345678 需要替換為實際的寄存器地址。 unsigned int 應該根據寄存器的位寬進行調整。

3. 如何最快比較兩組寄存器里有多少位不同

最快的辦法是使用位運算:

int diffBits(unsigned int reg1, unsigned int reg2) {return __builtin_popcount(reg1 ^ reg2); // GCC 內置函數,計算二進制數中 1 的個數
}

^ 運算符進行異或操作,得到兩個寄存器中不同的位。__builtin_popcount 是一個 GCC 內置函數,高效地計算結果中 1 的個數,也就是不同的位數。 其他編譯器可能提供類似的內置函數(例如,在 Clang 中是 __builtin_popcount,在某些 ARM 編譯器中可能是 __builtin_ctz 或類似的指令)。如果沒有內置函數,需要自己實現位計數算法,但效率會降低。

4. 如何降低功耗

降低功耗的方法有很多,取決于具體的硬件和軟件:

  • 使用低功耗器件: 選擇功耗低的處理器、外設和內存。
  • 降低 CPU 頻率和電壓: 在允許的情況下降低 CPU 的工作頻率和電壓。
  • 使用低功耗模式: 利用處理器提供的低功耗模式,例如休眠、睡眠等。
  • 優化代碼: 減少 CPU 的計算量和內存訪問次數。
  • 關閉不必要的模塊和外設: 在不需要的時候關閉不必要的模塊和外設。
  • 使用更有效的算法: 選擇更節能的算法。
  • 使用電源管理單元 (PMU): 利用 PMU 來管理電源和功耗。

5. 什么時候會用到 do...while(0)

do...while(0) 主要用于宏定義中,確保宏體無論如何都會被執行,并且可以避免在宏展開后產生語法錯誤。 例如:

#define MY_MACRO() do { \/* ... some code ... */ \
} while (0)

這樣,即使在 MY_MACRO() 后面加了分號,也不會導致語法錯誤。

6. GPIO 有幾種狀態

GPIO 通常有兩種主要狀態:輸入和輸出。 此外,還有一些中間狀態,例如:

  • 高阻抗: 輸入引腳不連接任何東西,處于高阻抗狀態。
  • 開漏輸出: 輸出引腳需要外部上拉電阻。
  • 推挽輸出: 輸出引腳可以驅動高低電平。
  • 模擬輸入/輸出: 一些 GPIO 可以配置為模擬輸入或輸出。

7. 如何用軟件處理硬件管腳抖動

軟件處理硬件管腳抖動的方法通常是使用軟件去抖動:

  • 延時法: 讀取 GPIO 狀態后,等待一段時間再讀取一次,如果兩次讀取的結果相同,則認為是有效狀態。
  • 計數法: 連續讀取 GPIO 狀態多次,如果連續多次狀態相同,則認為是有效狀態。
  • 狀態機法: 使用狀態機來處理 GPIO 狀態變化,避免抖動帶來的誤判。

8. 如何高效處理中斷

  • 中斷服務程序 (ISR) 盡量短小: ISR 應該盡可能短小,快速處理中斷請求,避免阻塞其他任務。
  • 使用中斷優先級: 根據中斷的重要性設置不同的優先級,確保重要中斷得到優先處理。
  • 中斷共享: 多個中斷可以共享同一個中斷向量,提高中斷效率。
  • 中斷屏蔽: 在處理中斷時,可以屏蔽其他中斷,避免中斷嵌套。
  • 使用中斷隊列: 將中斷請求放入隊列中,然后按順序處理。

9. delaysleep 的區別

  • delay 通常指簡單的延時函數,它會占用 CPU 時間,在延時期間 CPU 處于忙等待狀態。
  • sleep 通常指休眠函數,它會讓 CPU 進入低功耗狀態,在休眠期間 CPU 不占用 CPU 時間。

10. 中斷時可否睡眠

不可以。 在中斷服務程序 (ISR) 中不能調用 sleep 或其他會使進程阻塞的函數,因為這會阻止中斷的處理,導致系統不穩定。 ISR 應該快速執行并返回。

11. 如何設計 RAM 和 Flash 的驗證工具

RAM 和 Flash 的驗證工具通常需要執行以下步驟:

  • 讀寫測試: 寫入數據到 RAM 或 Flash 中,然后讀取數據,驗證數據是否一致。
  • 循環讀寫測試: 反復進行讀寫測試,驗證 RAM 或 Flash 的可靠性。
  • 壓力測試: 進行大量數據的讀寫測試,驗證 RAM 或 Flash 的性能。
  • 錯誤注入測試: 人為地注入錯誤,驗證 RAM 或 Flash 的錯誤檢測和糾正能力。
  • 邊界測試: 測試 RAM 或 Flash 的邊界條件,例如訪問超出范圍的地址。

12. 如何合理高效靜態分配內存

靜態內存分配在編譯時完成,優點是速度快,缺點是缺乏靈活性。合理高效的靜態內存分配需要:

  • 準確估計內存需求: 在編譯前準確估計程序所需的內存大小。
  • 避免內存浪費: 只分配程序真正需要的內存。
  • 使用結構體或數組: 使用結構體或數組來組織數據,提高內存利用率。

13. 如何跟蹤內存泄漏

  • 使用內存調試器: 使用內存調試器(例如 Valgrind)來檢測內存泄漏。
  • 手動檢查代碼: 仔細檢查代碼,查找可能導致內存泄漏的地方。
  • 使用內存泄漏檢測工具: 使用專門的內存泄漏檢測工具,例如 LeakCanary (Android)。
  • 記錄內存分配和釋放: 記錄每次內存分配和釋放操作,方便查找內存泄漏。

14. 如何實現一個 ring buffer 以及用途

Ring buffer 是一種循環緩沖區,可以高效地存儲和檢索數據。 實現方法:

#include <stdio.h>#define BUFFER_SIZE 10typedef struct {int buffer[BUFFER_SIZE];int head;int tail;int count;
} RingBuffer;void initRingBuffer(RingBuffer *rb) {rb->head = 0;rb->tail = 0;rb->count = 0;
}int enqueue(RingBuffer *rb, int data) {if (rb->count == BUFFER_SIZE) return 0; // Buffer fullrb->buffer[rb->tail] = data;rb->tail = (rb->tail + 1) % BUFFER_SIZE;rb->count++;return 1;
}int dequeue(RingBuffer *rb, int *data) {if (rb->count == 0) return 0; // Buffer empty*data = rb->buffer[rb->head];rb->head = (rb->head + 1) % BUFFER_SIZE;rb->count--;return 1;
}int main() {RingBuffer rb;initRingBuffer(&rb);enqueue(&rb, 10);enqueue(&rb, 20);int data;dequeue(&rb, &data);printf("Dequeued: %d\n", data);return 0;
}

用途: 處理實時數據流、緩沖 I/O 操作、音頻/視頻處理等。

15. DMA 和 FIFO 的區別

  • DMA (Direct Memory Access): 直接內存訪問,允許外設直接訪問內存,而無需 CPU 的干預。 速度快,效率高,但需要硬件支持。
  • FIFO (First-In, First-Out): 先進先出緩沖區,是一種簡單的內存緩沖區,數據按照先進先出的順序進行存儲和檢索。 實現簡單,但速度相對較慢,容量有限。

16. 如何做到統一 API 對接不同外設驅動

使用抽象層。 定義一個通用的 API 接口,然后為不同的外設驅動實現這個接口。 應用程序通過統一的 API 接口與外設進行交互,而無需關心底層驅動實現的細節。

17. 如何合理設計 Flash 分區表

Flash 分區表的設計需要考慮以下因素:

  • 分區大小: 根據不同的應用需求劃分不同大小的分區。
  • 分區數量: 根據實際需求確定分區數量。
  • 分區類型: 例如,代碼區、數據區、文件系統區等。
  • 分區對齊: 分區地址應該對齊到 Flash 的扇區大小,提高擦寫效率。
  • 冗余和備份: 考慮添加冗余分區,用于備份重要的數據。

18. 正常非掉電重啟是否要釋放內存

不需要。 操作系統會在重啟過程中自動釋放內存。

19. 正常掉電關機流程是否要釋放內存

不需要。 在正常掉電關機過程中,操作系統通常會執行一些清理操作,但不需要顯式釋放內存,因為電源關閉后內存中的數據會丟失。

20. 非掉電異常如何處理

非掉電異常處理需要:

  • 異常檢測: 檢測到異常后,需要立即停止程序的運行。
  • 保存現場: 保存程序運行的現場信息,例如寄存器值、堆棧指針等。
  • 錯誤處理: 根據異常類型進行相應的錯誤處理。
  • 重啟或恢復: 根據情況決定是重啟系統還是嘗試恢復系統。
  • 記錄日志: 記錄異常信息,方便后續分析。

21. 如何實現異常后的 dump

異常后的 dump 通常需要:

  • 硬件支持: 需要硬件支持,例如 JTAG 接口。
  • 調試器: 使用調試器來讀取內存中的數據。
  • 內存鏡像: 將內存中的數據保存到文件中。
  • 分析工具: 使用分析工具來分析 dump 文件,確定異常的原因。

讓我們逐一解答這些嵌入式系統開發中的常見問題:

22. 非正常掉電如何保護

非正常掉電會造成數據丟失和系統崩潰。保護措施主要集中在數據持久化和狀態保存上:

  • 使用非易失性存儲器 (NVM): 將關鍵數據存儲在 EEPROM、Flash 等非易失性存儲器中。在系統運行過程中,定期將數據寫入 NVM。掉電時數據得以保存。
  • 數據校驗: 在寫入 NVM 之前,對數據進行校驗,例如 CRC 校驗,確保數據完整性。掉電重啟后,可以校驗數據的完整性。
  • 寫保護機制: 對于重要的 NVM 數據區域,可以設置寫保護,防止意外寫入導致數據損壞。
  • 狀態機和上下文保存: 使用狀態機記錄系統當前狀態,并在掉電前將狀態信息保存到 NVM。重啟后,系統可以根據保存的狀態恢復運行。 這需要仔細設計,確保狀態信息足夠完整,能夠恢復系統到一致的狀態。
  • 文件系統: 使用支持原子操作的文件系統(例如,一些嵌入式文件系統支持事務性操作),確保文件寫入的完整性。

23. 如何設計一個簡單的 profiling 工具

一個簡單的 profiling 工具可以測量代碼的執行時間。 方法包括:

  • 基于時間的采樣: 周期性地中斷程序執行,記錄當前運行的函數。 這種方法簡單易實現,但精度受采樣頻率影響。
  • 基于指令計數器的采樣: 使用硬件指令計數器,統計每個函數執行的指令數。 這需要硬件支持。
  • 插入計時代碼: 在需要測量的代碼段前后插入計時代碼,記錄執行時間。 這種方法精度高,但需要修改代碼,工作量較大。

一個簡單的例子(基于插入計時代碼):

#include <stdio.h>
#include <time.h>void function_to_profile() {clock_t start = clock();// 代碼段clock_t end = clock();double cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;printf("Function execution time: %f seconds\n", cpu_time_used);
}int main() {function_to_profile();return 0;
}

24. 低功耗深睡眠如何喚醒后繼續之前工作

喚醒后繼續之前工作需要保存上下文信息:

  • 保存寄存器狀態: 在進入深睡眠前,保存 CPU 寄存器、中斷向量表等關鍵信息。
  • 保存內存狀態: 如果需要,保存關鍵內存數據到 NVM。
  • 使用 RTC (實時時鐘): RTC 可以提供時間信息,用于計算休眠時間或其他時間相關的任務。
  • 喚醒中斷: 使用外部中斷(例如,定時器中斷、按鍵中斷)喚醒系統。
  • 喚醒后恢復上下文: 喚醒后,恢復保存的寄存器狀態和內存數據,繼續執行之前的任務。

25. RTOS 不能斷點和打印的時候如何調試

RTOS 調試的挑戰在于其多線程和實時性。解決方法:

  • 使用 RTOS 提供的調試接口: 許多 RTOS 提供了調試接口,例如,任務狀態查看、消息隊列監控、信號量監控等。
  • 使用邏輯分析儀: 觀察總線上的數據傳輸,分析程序的運行情況。
  • 使用 JTAG 調試器: JTAG 調試器可以單步執行代碼,查看寄存器和內存內容。
  • 打印日志: 在關鍵位置打印日志信息,記錄程序的運行狀態。 注意避免過度打印影響系統性能。
  • 使用串口輸出: 通過串口輸出調試信息,實時監控程序運行。

26. 什么是交叉編譯

交叉編譯是指在一個平臺上編譯另一個平臺的代碼。例如,在 x86 架構的電腦上編譯 ARM 架構的嵌入式設備代碼。

27. 如何保證 Makefile 的增量編譯

Makefile 的增量編譯依賴于文件的依賴關系和時間戳。 make 命令會比較目標文件和依賴文件的時間戳,只有當依賴文件更新后,才會重新編譯目標文件。 確保 Makefile 正確定義了依賴關系是關鍵。

28. 如何用一套代碼支持不同硬件

  • 抽象硬件層: 將硬件相關的代碼封裝到抽象層中,提供統一的接口。 不同的硬件平臺實現不同的抽象層,但上層代碼無需修改。
  • 條件編譯: 使用預處理器指令(例如 #ifdef, #ifndef, #endif)根據不同的硬件平臺編譯不同的代碼。
  • 配置參數: 使用配置文件或命令行參數指定硬件平臺,程序根據配置參數選擇不同的硬件驅動程序。

29. 如何用一版軟件支持不同硬件 (與 28 類似)

這個問題與問題 28 重復,解決方法相同。

30. 不同代碼編譯后的存放區域有何不同

這取決于編譯器和鏈接器,但通常包括:

  • 代碼段 (.text): 存放程序的指令代碼。
  • 數據段 (.data): 存放已初始化的全局變量和靜態變量。
  • BSS 段 (.bss): 存放未初始化的全局變量和靜態變量。
  • 堆 (heap): 動態內存分配區域。
  • 棧 (stack): 函數調用和局部變量的存儲區域。

31. release 和 debug 編譯的區別

  • 優化級別: Release 版本通常進行優化,以提高程序的執行效率和減小代碼大小。Debug 版本通常不進行優化,以方便調試。
  • 調試信息: Debug 版本包含調試信息,方便調試器進行調試。Release 版本通常不包含調試信息。
  • 運行速度和大小: Release 版本運行速度更快,代碼大小更小。Debug 版本運行速度較慢,代碼大小較大。

32. ARM 多核之間有多少通訊機制及優缺點

ARM 多核之間的通訊機制包括:

  • 共享內存: 多個核訪問同一塊內存區域。優點:簡單高效;缺點:需要加鎖機制避免數據競爭,容易出現死鎖。
  • 中斷: 一個核通過中斷請求另一個核。優點:響應快;缺點:需要仔細設計中斷處理程序,容易出現中斷風暴。
  • Mailbox: 類似于消息隊列,用于核間通信。優點:避免數據競爭;缺點:效率相對較低。
  • 鎖機制: 互斥鎖、自旋鎖等,用于保護共享資源。
  • 緩存一致性協議: 保證多個核對共享內存的訪問一致性。

33. 兩個線程之間不同鎖的區別是什么

常見的鎖包括:

  • 互斥鎖 (Mutex): 一次只能被一個線程持有。 防止多個線程同時訪問共享資源。
  • 自旋鎖 (Spinlock): 線程獲取鎖失敗時,會一直循環嘗試獲取鎖,直到獲取成功。 適用于鎖持有時間短的情況,避免線程上下文切換開銷。
  • 讀寫鎖 (RWLock): 允許多個線程同時讀取共享資源,但只有一個線程可以寫入共享資源。

34. 如何理解收益邊界

收益邊界是指優化代碼所能帶來的性能提升的極限。 超過收益邊界,繼續優化代碼并不會帶來顯著的性能提升,反而可能增加代碼復雜度和維護成本。 需要權衡優化帶來的收益和成本。

35. 介紹一下自己關于代碼優化的經驗

代碼優化需要根據具體情況選擇合適的策略,我的經驗包括:

  • 選擇合適的算法和數據結構: 這是優化性能的關鍵。
  • 減少不必要的計算和內存訪問: 避免重復計算,使用緩存等技術提高效率。
  • 使用編譯器優化: 利用編譯器的優化選項,例如,內聯函數、循環展開等。
  • 代碼審查和性能測試: 通過代碼審查發現潛在的性能問題,并使用性能測試工具評估優化的效果。
  • 關注熱點代碼: 將優化重點放在程序中執行次數最多的代碼段。
  • 使用合適的工具: 例如,性能分析工具,幫助定位性能瓶頸。

36. 關于代碼移植有什么經驗分享

代碼移植的關鍵在于抽象和隔離:

  • 硬件抽象層 (HAL): 將硬件相關的代碼封裝到 HAL 中,方便移植到不同的硬件平臺。
  • 操作系統抽象層 (OSAL): 將操作系統相關的代碼封裝到 OSAL 中,方便移植到不同的操作系統。
  • 模塊化設計: 將代碼分解成獨立的模塊,方便移植和維護。
  • 良好的代碼風格和注釋: 方便理解和修改代碼。
  • 測試: 在移植后進行充分的測試,確保代碼的正確性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63027.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63027.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java基礎概念49-數據結構2

一、樹 1-1、樹的基本概念 1、樹的節點 2、二叉樹 3、樹的高度 1-2、二叉查找樹 普通二叉樹沒有規律&#xff0c;不方便查找&#xff0c;沒什么作用。 1、基本概念 2、添加節點 此時&#xff0c;該方式添加形成的二叉查找樹&#xff0c;根節點就是第一個節點。 3、查找節點 4…

GhatGPT缺陷不足和商業應用

1. 引言 ChatGPT的興起&#xff1a; 2022年末推出&#xff0c;迅速在自然語言處理和人工智能領域引起廣泛關注。數億用戶體驗其強大智能&#xff0c;感嘆機器智能的飛速發展。 存在的缺陷&#xff1a; 事實性錯誤&#xff1a;生成的文本中包含錯誤信息。無法實時更新&#xff1…

【Linux】Macvlan介紹及LInux下例子實現

Macvlan Macvlan 是一種網絡虛擬化技術&#xff0c;允許在同一物理網絡接口上創建多個虛擬網絡接口&#xff0c;每個虛擬接口都有自己獨立的 MAC 地址。這對于需要在同一物理主機上運行多個網絡隔離的應用程序或容器時非常有用。 Macvlan 的特點和用途 獨立的 MAC 地址 每個 …

Jackson @JsonInclude 注解

1. 概述 Jackson 是一個著名的Java庫&#xff0c;以轉換Java對象為JSON格式以及從JSON反序列化回Java對象而聞名。有時候&#xff0c;我們可能希望僅在某些字段滿足特定條件時才將其包含在JSON輸出中&#xff0c;而Jackson的JsonInclude注解正是為此目的量身定制的。 JsonInc…

12.12 枚舉 共用體 數據結構 創建順序表

1.思維導圖 2. 創建順序表 1>頭文件 test.h #ifndef __TEST_H__ #define __TEST_H__#include<stdlib.h> #include<stdio.h> #include<string.h>#define MAX 30 //typedef int datatype;typedef struct sequence {int data[MAX];int len;}seqlist,*se…

next.js 存在緩存中毒漏洞(CVE-2024-46982)

免責聲明: 本文旨在提供有關特定漏洞的深入信息,幫助用戶充分了解潛在的安全風險。發布此信息的目的在于提升網絡安全意識和推動技術進步,未經授權訪問系統、網絡或應用程序,可能會導致法律責任或嚴重后果。因此,作者不對讀者基于本文內容所采取的任何行為承擔責任。讀者在…

如何對小型固定翼無人機進行最優的路徑跟隨控制?

控制架構 文章繼續采用的是 ULTRA-Extra無人機&#xff0c;相關參數如下&#xff1a; 這里用于guidance law的無人機運動學模型為&#xff1a; { x ˙ p V a cos ? γ cos ? χ V w cos ? γ w cos ? χ w y ˙ p V a cos ? γ sin ? χ V w cos ? γ w sin ? χ…

【Flink-scala】DataStream編程模型之延遲數據處理

DataStream API編程模型 1.【Flink-Scala】DataStream編程模型之數據源、數據轉換、數據輸出 2.【Flink-scala】DataStream編程模型之 窗口的劃分-時間概念-窗口計算程序 3.【Flink-scala】DataStream編程模型之水位線 4.【Flink-scala】DataStream編程模型之窗口計算-觸發器-…

react useRef、useContext、useReducer使用中遇到的問題及解決辦法

在 React 中&#xff0c;useRef、useContext 和 useReducer 是三個非常有用的 Hook&#xff0c;它們可以幫助我們更好地管理組件的狀態和行為。然而&#xff0c;在使用這些 Hook 時&#xff0c;可能會遇到一些問題和困惑。本文將詳細解釋這三個 Hook 的工作原理&#xff0c;并提…

2024告別培訓班 數通、安全、云計算、云服務、存儲、軟考等1000G資源分享

大類有&#xff1a;軟考初級 軟考中級 軟考高級 華為認證 華三認證&#xff1a; 軟考初級&#xff1a; 信息處理技術員 程序員 網絡管理員 軟考中級&#xff1a; 信息安全工程師 信息系統監理師 信息系統管理工程師 嵌入式系統設計時 數據庫系統工程師 電子商務設…

《操作系統 - 清華大學》8 -1:進程的組成

文章目錄 1. 進程的組成2. 進程與程序的聯系3. 進程與程序的區別4. 進程與程序關系 1. 進程的組成 進程具體包含哪些東西&#xff1a; 首先要執行相應的代碼&#xff0c;所以執行代碼需要放到內存中代碼執行需要處理數據&#xff0c;數據需要放到內存中需要知道現在要執行哪條…

【Java】String類API

創建字符串 字符串字面量"Hello"高效&#xff0c;常量池復用常見、簡單的字符串創建 new 關鍵字new String("Hello")每次創建新對象&#xff0c;性能開銷較高顯式創建新對象 字符數組new String(char[])轉換字符數組字符數組轉字符串 StringBuilder/St…

數據結構初階---二叉樹---堆

一、樹 1.樹的概念 樹是一種非線性的數據結構&#xff0c;由n(n≥0)個有限結點組成的一個有層次關系的集合。形狀類似一棵倒掛的樹&#xff0c;根朝上&#xff0c;分支向下。 根結點沒有前驅結點&#xff0c;可以有n(n≥0)個后繼結點。 其余結點被分為M個互不相交的集合&am…

CocosCreator對配置文件加密

一、加密 1.首先假設你已經將Excel表格數據導出為了json數據 2.然后可以通關nodejs對其進行xor加密 const fs require(fs);// 讀取配置文件 const path "hero_info.json"; const data fs.readFileSync(path, utf-8); const jsonObject JSON.parse(data);// XO…

學習 Dockerfile 常用指令

學習 Dockerfile 常用指令 在構建 Docker 鏡像時&#xff0c;Dockerfile 文件是一份至關重要的配置文件&#xff0c;它定義了構建鏡像的所有步驟。通過在 Dockerfile 中使用不同的指令&#xff08;命令&#xff09;&#xff0c;我們可以控制鏡像的構建過程、設置環境、指定執行…

D95【python 接口自動化學習】- pytest進階之fixture用法

day95 pytest的fixture詳解&#xff08;二&#xff09; 學習日期&#xff1a;20241210 學習目標&#xff1a;pytest基礎用法 -- pytest的fixture詳解&#xff08;二&#xff09; 學習筆記&#xff1a; fixture(autouseTrue) func的autouse是TRUE時&#xff0c;所有函數方法…

C語言 字符串輸入輸出函數、scanf(“%[^\n]“,)可輸入空格 、fgets刪除換行符

字符串輸入函數&#xff1a; scanf&#xff08;"%s"&#xff0c;數組名&#xff09; gets&#xff08;數組名&#xff09; fgets&#xff08;&#xff09; --- 文件流輸入函數 函數原型&#xff1a; int scanf( const char *format, ...…

深度學習camp-第J4周:ResNet與DenseNet結合探索

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 本周任務&#xff1a; 探索ResNet和DenseNet的結合可能性本周任務較難&#xff0c;我們在chatGPT的幫助下完成 一、網絡的構建 設計一種結合 ResNet 和 Den…

「iOS」通過CoreLocation Framework深入了解MVC架構

「iOS」通過CoreLocation Framework重新了解多界面傳值以及MVC架構 文章目錄 「iOS」通過CoreLocation Framework重新了解多界面傳值以及MVC架構前言CoreLocation了解根據需求建模設計屬性方法設計協議傳值Block傳值KVONotification通知方式 總結參考文章 前言 在這個學期的前…

Debezium系列之:使用Debezium采集oceanbase數據庫

Debezium系列之:使用Debezium采集oceanbase數據庫 一、oceanbase數據庫二、安裝OceanBase三、安裝oblogproxy四、基于Docker的簡單采集案例五、生產實際應用案例Debezium 是一個開源的分布式平臺,用于監控數據庫變化和捕捉數據變動事件,并以事件流的形式導出到各種消費者。D…