掌握嵌入式Linux編程1開始

来源:https://www.cnblogs.com/testing-/archive/2023/06/01/17447500.html
-Advertisement-
Play Games

Linux技術文檔 1.說明 研究思路:從Linux外部向內部研究,從外部工具到系統內核深入的研究思路。本文檔主要針對外部工具進行實驗。並賦予實驗結論。 2.系統內核初識 1.系統記憶體管理:管理物理記憶體與虛擬記憶體(內核通過硬碟上的存儲空間來時間虛擬記憶體,這塊區域稱為交換空間) 2.軟體程式管理:in ...


我們先對嵌入式Linux做一個高層次的瞭解,看看它為什麼受歡迎,開放源碼許可證有什麼意義,以及你需要什麼樣的硬體來運行Linux。

1999年左右,Linux首次成為嵌入式設備的可行的選擇。那是在Axis (https://www.axis.com)發佈他們的第一臺Linux驅動的網路攝像機和TiVo (https://business.tivo.com)發佈他們的第一臺數字視頻錄像機(DVR)時。自1999年以來,Linux變得越來越流行,以至於今天它是許多類別產品的首選操作系統。2021年,有超過20億台設備運行Linux。這包括大量運行Android的智能手機,它使用Linux內核,以及數以億計的機頂盒、智能電視和Wi-Fi路由器,更不用說非常多樣化的設備,如車輛診斷、地磅、工業設備和醫療監測裝置等。

選擇Linux

為什麼Linux會如此普及?為什麼像電視這樣簡單的東西需要運行像Linux這樣複雜的東西才能在屏幕上顯示流媒體視頻?

簡單的答案是摩爾定律: 英特爾公司的聯合創始人戈登-摩爾(Gordon Moore)在1965年觀察到,晶元上的元件密度大約每兩年就會增加一倍。這適用於我們在日常生活中設計和使用的設備,正如它適用於台式機、筆記本電腦和伺服器一樣。大多數嵌入式設備的核心是一個高度集成的晶元,它包含一個或多個處理器內核以及與主存儲器、大容量存儲和多種類型的外設的介面。這被稱為片上系統,或SoC(System on Chip),而且SoC的複雜程度正按照摩爾定律不斷提高。典型的SoC有一本技術參考手冊,長達數千頁。你的電視不是簡單地顯示一個視頻流,就像以前的模擬機那樣。

該數據流是數字的,可能是加密的,它需要處理以創建一個圖像。你的電視已經(或很快將)與互聯網連接。它可以接收來自智能手機、平板電腦和家庭媒體伺服器的內容。它可以(或很快就會)用來玩游戲等等。你需要完整的操作系統來管理這種程度的複雜性。

以下是推動採用Linux的一些要點:

  • Linux有必要的功能。它有好的調度器個好的網路堆棧,支持USB、Wi-Fi、藍牙、多種存儲介質,對多媒體設備有很好的支持,等等。它滿足了所有的要求。
  • Linux已經被移植到廣泛的處理器架構上,包括一些在SoC設計中非常常見的架構--Arm、MIPS、x86和PowerPC。
  • Linux是開放源碼的,所以你可以自由地獲得源代碼並修改它以滿足你的需要。你,或代表你工作的人,可以為你的特定SoC板或設備創建板卡支持包。你可以添加協議、功能和技術,這些可能是主線源代碼中所缺少的。你可以刪除你不需要的功能,以減少記憶體和存儲要求。Linux是靈活的。
  • Linux有一個活躍的社區;就Linux內核而言,非常活躍。每隔8到10周就會個新的內核版本,每個版本都包含1000多個開發者的代碼。活躍的社區意味著Linux是最新的,支持當前的硬體、協議和標準。
  • 開放源碼許可證保證你可以獲得源代碼。沒有供應商的束縛。

由於這些原因,Linux是複雜設備的理想選擇。但在這裡我應該提到一些註意事項。複雜性使它更難理解。再加上快速發展的開發過程和開源的分散結構,你必須付出一些努力來學習如何使用它,並隨著它的變化而不斷地重新學習。我希望這本書能在這個過程中有所幫助。

什麼時候不選擇Linux

Linux適合你的項目嗎?在所要解決的問題能夠證明其複雜性的情況下,Linux的效果很好。在需要連接性、穩健性和複雜的用戶界面的地方,它尤其好。然而,它不能解決所有的問題,所以在你加入之前有一些事情需要考慮:

  • 你的硬體是否能勝任這項工作?與傳統的實時操作系統(RTOS)如VxWorks或QNX相比,Linux需要更多的資源。它至少需要一個32位的處理器和大量的記憶體。我將在關於典型硬體的章節中更詳細地介紹。
  • 你有正確的技能組合嗎?一個項目的早期部分,即電路板的搭建,需要詳細瞭解Linux以及它與你的硬體之間的關係。同樣地,在調試和調整你的應用程式時,你需要能夠解釋結果。如果你內部沒有這些技能,你可能想把一些工作外包出去。當然,讀這本書會有幫助
  • 你的系統是實時的嗎?Linux可以處理許多實時活動,只要你要註意某些細節,我將在第21章詳細介紹這些細節:實時編程。
  • 你的代碼是否需要監管部門的批准(醫療、汽車、航空等等)?監管部門的核查和驗證的負擔可能使另一個操作系統成為更好的選擇。即使你選擇Linux用於這些環境,從一個已經為現有產品(如你正在建造的產品)提供Linux的公司購買商業上可用的發行版可能是有意義的。

仔細考慮這些問題。成功的最佳指標可能是四處尋找運行Linux的類似產品,看看他們是如何做到的;遵循最佳實踐。

參與者

開源軟體從哪裡來?誰寫的?特別是,這與嵌入式開發的關鍵組件--工具鏈、引導程式、內核和根文件系統中的基本實用程式--有何關係?

主要的參與者如下:

  • 開源社區: 畢竟,這是產生你將要使用的軟體的引擎。這個社區是一個鬆散的開發者聯盟,其中許多人以某種方式得到資助,也許是由一個非營利組織、學術機構或一業公司資助。他們一起工作,以進一步實現各種項目的目標。有許多這樣的項目--有些小,有些大。在本書的其餘部分,我們將使用的一些項目是Linux本身、U-Boot、BusyBox、Buildroot、Yocto項目以及GNU旗下的許多項目。
  • CPU架構師: 這些是設計我們使用的CPU的組織。這裡重要的是Arm/Linaro(Arm Cortex-A)、Intel(x86和x86_64)、SiFive(RISC-V)和IBM(PowerPC)。他們實現或至少影響對基本CPU架構的支持。
  • SoC供應商(Broadcom、Intel、Microchip、NXP、Qualcomm、TI和許多其他公司): 他們從CPU架構師那裡獲得內核和工具鏈,並修改它們以支持他們的晶元。他們還創建了參考板:下一級使用的設計,以創建開發板和工作產品。
  • 板卡供應商和OEMs: 這些人從SoC供應商那裡獲得參考設計,並將其構建到特定的產品中,例如機頂盒或相機,或創建更多的通用開發板,如研華和控創的開發板。一個重要的類別是廉價的開發板,如BeagleBoard/BeagleBone和Raspberry Pi,它們創造了自己的軟體和硬體附加組件的生態系統。
  • 商業Linux供應商: 西門子(Mentor)、Timesys和風河等公司提供商業Linux發行版,這些發行版在多個行業(醫療、汽車、航空航天等)都經過了嚴格的法規驗證和確認。

這些構成了一個鏈條,你的項目通常在最後,這意味著你不能自由選擇組件。你不能簡單地從https://www.kernel.org/,除非在少數情況下,因為它不支持你正在使用的晶元或電路板。

這是嵌入式開發中的一個持續問題。理想情況下,鏈條上每個環節的開發者都會把他們的變化推到上游,但他們沒有這樣做。發現一個內核有成千上萬的補丁沒有被合併的情況並不少見。此外,SoC供應商傾向於只為其最新的晶元積極開發開源組件,這意味著對任何超過幾年前的晶元的支持將被凍結,不會收到任何更新。

其結果是,大多數嵌入式設計是基於舊版本的軟體。他們不會收到安全修複、性能增強或較新版本的功能。諸如Heartbleed(OpenSSL庫中的一個錯誤)和ShellShock(bash shell中的一個錯誤)等問題都沒有得到修複。我將在本章後面的安全主題下進一步討論這個問題。

你能做什麼呢?首先,向你的供應商(恩智浦、德州儀器和賽靈思,僅舉幾例)提問:他們的更新政策是什麼,他們多久修改一次內核版本,當前的內核版本是什麼,之前的版本是什麼,他們向上游合併變化的政策是什麼?一些供應商在這方面正在取得長足進步。你應該首選他們的晶元。

第二,你可以採取措施使自己更加自給自足。第1節中的各章更詳細地解釋了依賴性,並告訴你在哪些方面可以幫助自己。不要只是接受SoC或電路板供應商提供給你的軟體包,而不考慮其他選擇,盲目地使用它。

在項目生命周期中前進

本書分為四個部分,反映了一個項目的各個階段。這些階段不一定是有順序的。通常情況下,它們是重疊的,你需要跳回去重新審視以前做過的事情。然而,它們代表了開發人員在項目進展過程中所關註的問題:

  • 嵌入式Linux的要素(第1至8章)將幫助你建立開發環境,併為後面的階段創建一個工作平臺。它通常被稱為 "板塊建立 "階段。
  • 系統結構和設計選擇(第9章到第15章)將幫助你研究一些你必須做出的設計決定,涉及程式和數據的存儲,如何在內核設備驅動程式和應用程式之間進行分工,以及如何初始化系統。
  • 編寫嵌入式應用程式(第16至18章)展示瞭如何打包和部署Python應用程式,有效利用Linux進程和線程模型,以及如何在一個資源受限的設備中管理記憶體。
  • 調試和優化性能(第19章到21章)描述瞭如何在應用程式和內核中跟蹤、剖析和調試你的代碼。最後一章解釋了在需要時如何設計實時行為。

嵌入式Linux的四個要素

每個項目都是從獲得、定製和部署這四個要素開始的:工具鏈、引導程式、內核和根文件系統。這就是本書第一節的主題。

  • 工具鏈: 為你的目標設備創建代碼所需的編譯器和其他工具。
  • Bootloader: 初始化電路板並載入Linux內核的程式。
  • 內核: 這是系統的核心,管理系統資源和與硬體的介面。
  • 根文件系統: 包含庫和程式,一旦內核完成初始化就會運行。

當然,還有一個第五元素,這裡沒有提到。這就是專門針對你的嵌入式應用的程式集合,使設備做任何它應該做的事情,無論是稱雜貨、顯示電影、控制機器人,還是駕駛無人機。

通常情況下,當你購買SoC或電路板時,你會被提供一些或所有這些元素作為一個包。但是,由於前一段中提到的原因,它們可能不是你的最佳選擇。我將在前八章中給你提供背景,讓你做出正確的選擇,我還將向你介紹兩個工具,為你自動完成整個過程: Buildroot和Yocto項目。

瀏覽開放源代碼

嵌入式Linux的組件都是開源的,所以現在是考慮這意味著什麼的好時機,為什麼開源以它們的方式工作,以及這對你將用它創建的通常是專有的嵌入式設備有什麼影響。

許可證

在談論開源時,經常使用自由這個詞。剛接觸這個話題的人往往認為它意味著無需付費,而開源軟體許可證確實保證你可以免費使用該軟體來開發和部署系統。然而,這裡更重要的含義是自由,因為你可以自由地獲得源代碼,以任何你認為合適的方式修改它,併在其他系統中重新部署它。這些許可證給了你這個權利。與免費軟體許可證相比,後者允許你免費複製二進位文件,但不給你源代碼,或者其他許可證允許你在某些情況下免費使用該軟體,例如,用於個人用途,但不用於商業。這些都不是開源的。

為了幫助你理解使用開放源碼許可證的意義,我將提供以下評論,但我想指出,我是一名工程師,而不是一名律師。以下是我對許可證的理解和對它們的解釋方式。

開源許可證大致分為兩類:自由複製許可證,如GNU通用公共許可證(GPL),以及允許性許可證,如BSD和MIT許可證。

允許性許可證實質上是說,只要你不以任何方式修改許可證的條款,你就可以修改源代碼併在你自己選擇的系統中使用它。換句話說,有了這一限制,你就可以隨心所欲地使用它,包括將它構建到可能的專有系統中。

GPL許可證是類似的,但有條款迫使你把獲得和修改軟體的權利轉給你的最終用戶。換句話說,你要分享你的源代碼。一種選擇是把它放到一個公共伺服器上,使其完全公開。另一種方法是通過書面形式提供給你的最終用戶,當他們要求時,你可以提供代碼。GPL進一步指出,你不能將GPL代碼納入專有程式。任何這樣做的嘗試都會使GPL適用於整體。換句話說,你不能在一個程式中結合GPL和專有代碼。除了Linux內核,GNU編譯器集和GNU調試器以及許多其他與GNU項目相關的免費工具都屬於GPL的保護範圍。

那麼,庫呢?如果它們獲得了GPL的許可,任何與之鏈接的程式也將獲得GPL的許可。然而,大多數庫是以GNU小公共許可證(LGPL)授權的。如果是這種情況,你可以從一個專有程式中與它們鏈接。

重要提示

所有前面的描述都與GPL v2和LGPL v2.1特別相關。我應該提到最新版本的GPL v3和LGPL v3。這些都是有爭議的,我承認我並不完全瞭解其含義。然而,其目的是確保任何系統中的GPL v3和LGPL v3組件都可以被終端用戶替換,這符合開放源碼軟體對所有人的精神。

不過,GPL v3和LGPL v3也有其問題。有安全方面的問題。如果一個設備的所有者能夠訪問系統代碼,那麼不受歡迎的入侵者也可能會訪問。通常的防禦措施是擁有由權威機構(如供應商)簽署的內核鏡像,這樣未經授權的更新就不可能發生。這是否侵犯了我修改設備的權利?眾說紛紜。

重要說明

TiVo機頂盒是這場辯論的一個重要部分。它使用的是Linux內核,該內核在GPL v2下獲得許可。TiVo已經發佈了他們的內核版本的源代碼,因此遵守了該許可。TiVo也有一個引導程式,只能載入由他們簽名的內核二進位文件。因此,你可以為TiVo盒子建立一個修改過的內核,但你不能在硬體上載入它。自由軟體基金會(FSF)認為這不符合開源軟體的精神,並將這種程式稱為Tivo化。GPL v3和LGPL v3的編寫是為了明確地防止這種情況的發生。一些項目,特別是Linux內核,一直不願意採用GPL第3版許可證,因為它們會給設備製造商帶來限制。

為嵌入式Linux選擇硬體

如果你正在為一個嵌入式Linux項目設計或選擇硬體,你要註意什麼?

首先,一個內核支持的CPU架構--當然,除非你打算自己添加一個新的架構 看一下Linux 5.4的源代碼,有25個架構,每個架構都由arch/目錄下的一個子目錄代表。它們都是
32位或64位架構,大多數有MMU,但有些沒有。嵌入式設備中最常見的是Arm、MIPS、PowerPC和x86,它們都有32位和64位的變體,都有記憶體管理單元(MMU)。

本書的大部分內容都是針對這類處理器而寫的。還有一類處理器沒有MMU(memory management units),運行Linux的一個子集,稱為微控制器Linux或uClinux。這些處理器架構包括ARC(Argonaut RISC Core)、Blackfin、MicroBlaze和Nios。我將不時地提到uClinux,但我不會詳細介紹,因為這是一個相當專業的話題。

第二,你將需要合理數量的記憶體。16 MiB是一個很好的最低限度,儘管使用一半的記憶體也很有可能運行Linux。如果你準備對系統的每個部分進行優化,甚至有可能用4MB來運行Linux。甚至有可能更低,但有一點是,它不再是Linux了。

第三,有非易失性存儲,通常是快閃記憶體。對於一個簡單的設備,如網路攝像頭或一個簡單的路由器,8兆位元組就足夠了。與記憶體一樣,如果你真的想,你可以用更少的存儲空間創建一個可行的Linux系統,但你走得越低,就越難。Linux對快閃記憶體設備有廣泛的支持,包括原始的NOR和NAND快閃記憶體晶元,以及SD卡、eMMC晶元、USB快閃記憶體等形式的管理快閃記憶體。

第四,一個串列埠是非常有用的,最好是基於UART的串列埠。它不一定要安裝在生產板上,但可以使板子的安裝、調試和開發更容易。

第五,從頭開始時,你需要一些載入軟體的手段。許多微控制器板都配備了一個聯合測試行動組(JTAG)介面,用於這一目的。現代SoC也有能力直接從可移動媒體,特別是SD和微型SD卡,或UART或USB等串列介面載入啟動代碼。

除了這些基本要素外,還有與你的設備所需的特定硬體位的介面,以完成其工作。主線Linux為數以千計的不同設備配備了開源驅動程式,還有來自SoC製造商和可能包含在設計中的第三方晶元的OEM廠商的驅動程式(質量不一),但記得我對一些製造商的承諾和能力的評論。作為一個嵌入式設備的開發者,你會發現你花了相當多的時間來評估和調整第三方代碼(如果你有的話),或者與製造商聯繫(如果你沒有的話)。最後,你將不得不為設備特有的介面編寫設備支持,或者找人幫你寫。

獲得本書的硬體

本書中的例子是通用的,但為了使它們具有相關性並易於學習,我不得不選擇特定的硬體。我選擇了三個示範設備:Raspberry Pi 4、BeagleBone Black和QEMU。第一個是迄今為止市場上最流行的基於Arm的單板電腦。第二種是廣泛提供的、廉價的開發板,可用於嚴重的嵌入式硬體。第三種是一個機器模擬器,可以用來創建一系列典型的嵌入式硬體的系統。完全使用QEMU是很誘人的,但是,像所有的模擬器一樣,它與真實的東西不太一樣。使用Raspberry Pi 4和BeagleBone Black,你就有了與真正的硬體互動和看到真正的LED燈閃爍的滿足。雖然BeagleBone Black已經有幾年曆史了,但它仍然是開源硬體(與樹莓派不同)。這意味著板子的設計材料是免費提供的,任何人都可以將BeagleBone Black或其衍生品製作成他們的產品。

在任何情況下,我鼓勵你使用這三個平臺中的任何一個,或者你手頭可能有的任何嵌入式硬體,儘可能多地嘗試這些例子。

Raspberry Pi 4

在寫這篇文章的時候,Raspberry Pi 4 Model B是Raspberry Pi基金會生產的旗艦型小型雙顯示器台式電腦。他們的網站是
https://raspberrypi.org/。Pi 4的技術規格包括以下內容:

  • 博通BCM2711 1.5 GHz四核Cortex-A72(Arm® v8)64位SoC
  • 2、4或8 GiB DDR4記憶體
  • 2.4 GHz和5.0 GHz 802.11ac無線網路、藍牙5.0、BLE
  • 一個用於調試和開發的串列埠
  • 一個MicroSD插槽,可作為啟動設備使用
  • 一個USB-C介面,用於為電路板供電
  • 2個全尺寸的USB 3.0和2個全尺寸的USB 2.0主機埠
  • 一個千兆位乙太網埠
  • 2個用於視頻和音頻輸出的micro-HDMI埠

此外,還有一個40針的擴展頭,有各種各樣的子板,被稱為HATs(硬體附加在上面),允許你調整板子做許多不同的事情。然而,在本書的例子中,你將不需要任何HATs。相反,你將利用Pi 4的內置Wi-Fi和藍牙(BeagleBone Black缺乏這種功能)。

除了電路板本身之外,你還需要以下東西:

  • 一個5V的USB-C電源,能夠提供3A或更大的電流
  • 一條帶有3.3V邏輯電平引腳的USB至TTL串列電纜,如Adafruit 954
  • 一張MicroSD卡,以及從你的開發電腦或筆記本電腦上寫入該卡的方法,這將需要將軟體載入到電路板上。
  • 一根乙太網電纜和一個路由器,因為有些例子需要網路連接。

BeagleBone Black

BeagleBone和後來的BeagleBone Black是由CircuitCo LLC生產的小型信用卡大小的開發板的開放硬體設計。主要的信息庫是在https://beagleboard.org/。規格的要點如下:

  • 一個TI AM335x 1 GHz Arm® Cortex-A8 Sitara SoC
  • 512 MiB DDR3 RAM
  • 2或4 GiB 8位eMMC板載快閃記憶體
  • 一個用於調試和開發的串列埠
  • 一個MicroSD插槽,可作為啟動設備使用
  • 一個迷你USB OTG客戶端/主機埠,也可用於為電路板供電
  • 一個全尺寸的USB 2.0主機埠
  • 一個10/100乙太網埠
  • 一個用於視頻和音頻輸出的HDMI埠
    此外,還有兩個46針的擴展頭,有各種各樣的子板,被稱為 "披風",使你可以使板子做許多不同的事情。然而,在本書的例子中,你不需要安裝任何capes。

除了板子本身之外,你還需要以下東西:

  • 一條Mini-USB到USB-A的電纜(隨板提供)。
  • 一條能與板子提供的6針3.3V TTL電平信號連接的串列電纜。
  • 一條可以與板子提供的6針3.3V TTL電平信號連接的串列電纜。BeagleBoard網站有相容電纜的鏈接。
  • 一張MicroSD卡和一種從你的開發電腦或筆記本上寫入卡的方法,這將需要將軟體載入到板子上。
  • 一根乙太網電纜和一個連接路由器,因為有些例子需要網路連接。
  • 一個能夠提供1 A或更多的5V電源。

除了上述內容外,第12章 "用突破板進行原型開發 "還需要
以下物品:

  • 一塊SparkFun公司的GPS-15193分線板。
  • 一個Saleae Logic 8邏輯分析器。這個儀器將被用來探測BeagleBone Black和NEO-M9N之間的SPI通信的引腳。

QEMU

QEMU是一個機器模擬器。它有許多不同的版本,每個版本都可以模擬一個處理器架構和一些使用該架構的板子。例如,我們有以下幾種:

  • qemu-system-arm: 32位Arm
  • qemu-system-mips: MIPS
  • qemu-system-ppc: PowerPC
  • qemu-system-x86: x86和x86_64
    對於每個架構,QEMU都模擬了一系列的硬體,你可以通過使用-machine幫助選項查看。每台機器都模擬了該板上通常會有的大部分硬體。有一些選項可以將硬體與本地資源聯繫起來,比如使用一個本地文件來模擬磁碟驅動器。

下麵是一個具體的例子:

$ qemu-system-arm -machine vexpress-a9 -m 256M -drive file=rootfs.ext4,sd -net nic -net use -kernel zImage -dtb vexpress- v2p-ca9.dtb -append "console=ttyAMA0,115200 root=/dev/mmcblk0" -serial stdio -net nic,model=lan9118 -net tap,ifname=tap0

前面的命令行中使用的選項如下:

  • -machine vexpress-a9: 創建一個帶有Cortex A-9處理器的Arm Versatile Express開發板的模擬系統。
  • -m 256M: 用256MB的記憶體填充它
  • -drive file=rootfs.ext4,sd: 將SD介面連接到本地文件rootfs.ext4(其中包含一個文件系統鏡像)。
  • -kernel zImage: 從名為zImage的本地文件中載入Linux內核。
  • -dtb vexpress-v2p- ca9.dtb: 從本地文件vexpress-v2p-ca9.dtb中載入設備樹。
  • -append "...": 添加這個字元串作為內核命令行
  • -serial stdio: 將串口連接到啟動QEMU的終端,通常這樣你就可以通過串口控制台登錄到模擬機上。
  • -net nic,model=lan9118: 創建一個網路介面。
  • -net tap,ifname=tap0: 將網路介面連接到虛擬網路介面tap0。
    要配置網路的主機端,你需要用戶模式Linux(UML)項目中的tunctl命令;在Debian和Ubuntu上,該軟體包名為uml-utilites:
$ sudo tunctl -u $(whoami) -t tap0

這將創建一個名為tap0的網路介面,連接到模擬的QEMU機器的網路控制器上。你配置tap0的方式與配置其他介面的方式完全一樣。

所有這些選項在下麵的章節中都有詳細描述。我將在我的大多數例子中使用Versatile Express,但使用不同的機器或架構應該是很容易的。

配置你的開發環境

我只使用了開源軟體,無論是開發工具還是目標操作系統和應用程式。我假設你將在你的開發系統上使用Linux。我使用Ubuntu 20.04 LTS測試了所有的主機命令,所以對這個特定的版本有一點偏愛,但任何現代的Linux發行版都可能工作得很好。

釘釘或微信號: pythontesting 微信公眾號:pythontesting
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在前面的幾篇文章中,詳細地給大家介紹了Java里的集合。但在介紹集合時,我們涉及到了泛型的概念卻並沒有詳細學習,所以今天我們要花點時間給大家專門講解什麼是泛型、泛型的作用、用法、特點等內容 ...
  • # Rust Web 全棧開發之 Web Service 中的錯誤處理 ## Web Service 中的統一錯誤處理 ### Actix Web Service 自定義錯誤類型 -> 自定義錯誤轉為 HTTP Response - 資料庫 - 資料庫錯誤 - 串列化 - serde 錯誤 - I/ ...
  • 1. 透過現象看本質 反射被譽為是 c#中的黑科技 ,在很多領域中都有反射的身影,例如,我們經常使用的ORM框架,ABP框架 等。 反射指程式可以訪問、檢測和修改它本身狀態或行為的一種能力。. 程式集包含模塊,而模塊包含類型,類型又包含成員。. 反射則提供了封裝程式集、模塊和類型的對象。. 您可以使 ...
  • 1. 為什麼需要單元測試 在我們之前,測試某些功能是否能夠正常運行時,我們都將代碼寫到Main方法中,當我們測試第二個功能時,我們只能選擇將之前的代碼清掉,重新編寫。此時,如果你還想重新測試你之前的功能時,這時你就顯得有些難為情了,因為代碼都被你清掉了。當然你完全可以把代碼寫到一個記事本中進行記錄, ...
  • 1. ADO.NET的前世今生 ADO.NET的名稱起源於ADO(ActiveX Data Objects),是一個COM組件庫,用於在以往的Microsoft技術中訪問數據。之所以使用ADO.NET名稱,是因為Microsoft希望表明,這是在NET編程環境中優先使用的數據訪問介面。 ADO.NE ...
  • ### 前言 當我們編寫 C# 代碼時,經常需要處理大量的數據集合。在傳統的方式中,我們往往需要先將整個數據集合載入到記憶體中,然後再進行操作。但是如果數據集合非常大,這種方式就會導致記憶體占用過高,甚至可能導致程式崩潰。 C# 中的`yield return`機制可以幫助我們解決這個問題。通過使用`y ...
  • ## 引言 最近發現自己喜歡用的 Todo 軟體總是差點意思,畢竟每個人的習慣和工作流不太一樣,我就想著自己寫一個小的[Todo 項目]( https://github.com/circler3/TodoTrack ),核心的功能是自動記錄 Todo 執行過程中消耗的時間(尤其面向程式員),按照自己 ...
  • 目錄 一、函數 1.傳參 二、返回值 return 三、終止符 exit 四、實驗 一、函數 概念:函數是定義一個函數名,可以調用函數方法,完成便捷處理。 函數作用: 1.避免方法名重覆。 2.將代碼分割成一塊一塊,便於查看。 傳參:內部傳參 外部傳參 混合外部內部傳參混合外部內部傳參 例子演示: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...