整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          MySQL采用哪種數據模型_數據庫的三種數據模型分別是什么

          e75b95fbd8475083eb94f117a980d5da.png

          層次模型

          層次模型是數據庫系統最早使用的一種模型,它的數據結構是一棵“有向樹”。根結點在最上端,層次最高,子結點在下,逐層排列。層次模型的特征是:

          1、有且只有一個根結點;

          2、其他結點有且僅有一個父結點。

          網狀模型

          數據庫系統模型有三個_模型庫數據系統有哪些_模型是數據庫

          網狀模型以網狀結構表示實體與實體之間的聯系。網中的每一個結點代表一個記錄類型,聯系用鏈接指針來實現。網狀模型可以表示多個從屬關系的聯系,也可以表示數據間的交叉關系,即數據間的橫向關系與縱向關系,它是層次模型的擴展。網狀模型可以方便地表示各種類型的聯系,但結構復雜,實現的算法難以規范化。其特征是:

          1、允許結點有多于一個父結點;

          2、可以有一個以上的結點沒有父結點。

          關系模型

          關系模型以二維表結構來表示實體與實體之間的聯系,它是以關系數學理論為基礎的。關系模型的數據結構是一個“二維表框架”組成的集合。每個二維表又可稱為關系。在關系模型中,操作的對象和結果都是二維表。關系模型是目前最流行的數據庫模型。支持關系模型的數據庫管理系統稱為關系數據庫管理系統,Access就是一種關系數據庫管理系統。

          數據庫系統模型有三個_模型庫數據系統有哪些_模型是數據庫

          特征:

          1、描述的一致性,不僅用關系描述實體本身,而且也用關系描述實體之間的聯系;

          2、可直接表示多對多的聯系;

          3、關系必須是規范化的關系,即每個屬性是不可分的數據項,不許表中有表;

          4、關系模型是建立在數學概念基礎上的,有較強的理論依據。

          嵌入式中5個難查的軟件問題

          點擊上方“嵌入式情報局”,選擇“置頂/星標”

          嵌入式情報,第一時間送達

          在嵌入式開發軟件中查找和消除潛在的錯誤是一項艱巨的任務。

          通常需要英勇的努力和昂貴的工具才能從觀察到的崩潰,死機或其他計劃外的運行時行為追溯到根本原因。

          在最壞的情況下,根本原因會破壞代碼或數據,使系統看起來仍然可以正常工作或至少在一段時間內仍能正常工作。

          工程師常常放棄嘗試發現不常見異常的原因,這些異常在實驗室中不易再現,將其視為用戶錯誤或“小故障”。

          然而,機器中的這些鬼魂仍然存在。這是難以重現錯誤的最常見根本原因指南。每當您閱讀固件源代碼時,請查找以下五個主要錯誤。并遵循建議的最佳做法,以防止它們再次發生在您身上。

          1、競爭條件

          競爭條件是指兩個或多個執行線程(可以是RTOS任務或main() 和中斷處理程序)的組合結果根據交織指令的精確順序而變化的任何情況。每個都在處理器上執行。

          例如,假設您有兩個執行線程,其中一個規則地遞增一個全局變量( + = 1; ),而另一個偶然將其歸零( = 0; )。如果不能始終以原子方式(即,在單個指令周期內)執行增量,則存在競爭條件。

          如圖1所示,將任務視為汽車接近同一十字路口。計數器變量的兩次更新之間的沖突可能永遠不會發生,或者很少會發生。但是,這樣做的時候,計數器實際上不會在內存中清零。其值至少在下一個清零之前是損壞的。這種影響可能會對系統造成嚴重后果,盡管可能要等到實際碰撞后很長一段時間才會出現。

          意外的數據包讀取錯誤_讀取意外錯誤包數據的軟件_讀取錯誤數據或已損壞

          最佳實踐:可以通過必須以適當的搶先限制行為對原子地執行代碼的關鍵部分,來避免競爭條件。為防止涉及ISR的爭用情況,必須在另一個代碼的關鍵部分持續時間內至少禁止一個中斷信號。

          對于RTOS任務之間的爭用,最佳實踐是創建特定于該共享庫的互斥體,每個互斥體在進入關鍵部分之前必須獲取該互斥體。請注意,依靠特定CPU的功能來確保原子性不是一個好主意,因為這只能防止爭用情況發生,直到更換編譯器或CPU。

          共享數據和搶占的隨機時間是造成競爭狀況的元兇。但是錯誤可能并不總是會發生,這使得從觀察到的癥狀到根本原因的種族狀況跟蹤變得異常困難。因此,保持警惕以保護所有共享對象非常重要。每個共享對象都是一個等待發生的事故。

          最佳實踐:命名所有潛在共享的對象(包括全局變量,堆對象或外圍寄存器和指向該對象的指針),以使風險對于所有將來的代碼閱讀者而言都是顯而易見的;在Netrino嵌入式C編碼標準提倡使用“的G_ 為此,”前綴。查找所有可能共享的對象將是爭用條件代碼審核的第一步。

          2、不可重入功能

          從技術上講,不可重入功能的問題是爭用狀況問題的特例。而且,由于相關原因,由不可重入函數引起的運行時錯誤通常不會以可重現的方式發生-使它們同樣難以調試。

          不幸的是,非重入功能也比其他類型的競爭條件更難在代碼審查中發現。

          圖2 顯示了一個典型的場景。在這里,要搶占的軟件實體也是RTOS任務。但是,它們不是通過直接調用共享對象而是通過函數調用間接操作。

          例如,假設任務A調用套接字層協議功能,該套接字功能調用TCP層協議功能,調用IP層協議功能,該功能調用以太網驅動程序。為了使系統可靠地運行,所有這些功能都必須是可重入的。

          讀取意外錯誤包數據的軟件_意外的數據包讀取錯誤_讀取錯誤數據或已損壞

          意外的數據包讀取錯誤_讀取意外錯誤包數據的軟件_讀取錯誤數據或已損壞

          但是,以太網驅動程序的所有功能都以以太網控制器芯片的寄存器形式操作相同的全局對象。如果在這些寄存器操作期間允許搶占,則任務B可以在將數據包A排隊之后但在發送開始之前搶占任務A。

          然后,任務B調用套接字層功能,該套接字層功能調用TCP層功能,再調用IP層功能,該功能調用以太網驅動程序,該隊列將數據包B排隊并傳輸。當CPU的控制權返回到任務A時,它將請求傳輸。根據以太網控制器芯片的設計,這可能會重傳數據包B或產生錯誤。數據包A丟失,并且不會發送到網絡上。

          為了可以同時從多個RTOS任務中調用此以太網驅動程序的功能,必須使它們可重入。如果它們每個僅使用堆棧變量,則無事可做。

          因此,C函數最常見的樣式固有地是可重入的。但是,除非精心設計,否則驅動程序和某些其他功能將是不可重入的。

          使函數可重入的關鍵是暫停對外圍設備寄存器,包括靜態局部變量,持久堆對象和共享內存區域在內的全局變量的所有訪問的搶占。這可以通過禁用一個或多個中斷或獲取并釋放互斥鎖來完成。問題的細節決定了最佳解決方案。

          最佳實踐:在每個庫或驅動程序模塊中創建和隱藏一個互斥量,這些互斥量不是本質上可重入的。使獲取此互斥鎖成為操作整個模塊中使用的任何持久數據或共享寄存器的前提。

          例如,相同的互斥鎖可用于防止涉及以太網控制器寄存器和全局或靜態本地數據包計數器的競爭情況。在訪問這些數據之前,模塊中訪問此數據的所有功能必須遵循協議以獲取互斥量。

          注意非重入功能可能會作為第三方中間件,舊版代碼或設備驅動程序的一部分進入您的代碼庫。

          令人不安的是,不可重入函數甚至可能是編譯器隨附的標準C或C ++庫的一部分。如果您使用GNU編譯器來構建基于RTOS的應用程序,請注意您應該使用可重入的“ newlib”標準C庫,而不是默認庫。

          3、缺少關鍵字

          如果未使用C的 關鍵字標記某些類型的變量,則可能導致僅在將編譯器的優化器設置為低級或禁用編譯器才能正常工作的系統中出現許多意外行為。該揮發性預選賽期間變量聲明,其中它的目的是為了防止優化的讀取和變量的寫入使用。

          例如,如果您編寫清單1所示的代碼,則優化器可能會通過消除第一行來嘗試使程序更快速,更小,從而損害患者的健康。但是,如果將g_alarm 聲明為 ,那么將不允許這種優化。

          讀取意外錯誤包數據的軟件_意外的數據包讀取錯誤_讀取錯誤數據或已損壞

          最佳實踐:將揮發 的關鍵字應該用于聲明每個:

          由ISR和代碼的任何其他部分訪問的全局變量,

          由兩個或多個RTOS任務訪問的全局變量(即使已阻止了這些訪問中的競爭條件),

          指向內存映射外設寄存器(或一組或一組寄存器)的指針,以及

          延遲循環計數器。

          請注意,除了確保所有讀寫操作都針對給定變量之外,使用 還通過添加其他“序列點”來限制編譯器。除易失性變量的讀取或寫入之外的其他易失性訪問必須在該訪問之前執行。

          4、堆棧溢出

          每個程序員都知道堆棧溢出是很不好的事情。但是,每次堆棧溢出的影響都各不相同。損壞的性質和不當行為的時機完全取決于破壞哪些數據或指令以及如何使用它們。重要的是,從堆棧溢出到它對系統的負面影響之間的時間長短取決于使用阻塞位之前的時間。

          意外的數據包讀取錯誤_讀取意外錯誤包數據的軟件_讀取錯誤數據或已損壞

          不幸的是,堆棧溢出比臺式計算機更容易遭受嵌入式系統的困擾。這有幾個原因,其中包括:

          (1)嵌入式系統通常只能占用較少的RAM;

          (2)通常沒有虛擬內存可回退(因為沒有磁盤);

          (3)基于RTOS任務的固件設計利用了多個堆棧(每個任務一個),每個堆棧的大小都必須足夠大,以確保不會出現唯一的最壞情況的堆棧深度;

          (4)中斷處理程序可能會嘗試使用這些相同的堆棧。

          使該問題進一步復雜化的是,沒有大量的測試可以確保特定的堆棧足夠大。您可以在各種加載條件下測試系統,但是只能測試很長時間。僅在“半個藍月亮”中運行的測試可能不會見證僅在“一次藍月亮”中發生的堆棧溢出。在算法限制(例如無遞歸)下,可以通過對代碼的控制流進行自上而下的分析來證明不會發生堆棧溢出。但是,每次更改代碼時,都需要重做自上而下的分析。

          最佳實踐:啟動時,在整個堆棧上繪制不太可能的內存模式。(我喜歡使用十六進制23 3D 3D 23,它看起來像ASCII內存轉儲中的籬笆' #==# '。)在運行時,讓管理員任務定期檢查是否沒有任何涂料在預先設定的高水位上方標記已更改。

          如果發現某個堆棧有問題,請在非易失性內存中記錄特定的錯誤(例如哪個堆棧以及洪水的高度),并為產品的用戶做一些安全的事情(例如,受控關閉或重置)可能會發生真正的溢出。這是添加到看門狗任務中的一項不錯的附加安全功能。

          5、堆碎片化

          嵌入式開發工程師并沒有很好地利用動態內存分配。其中之一是堆碎片的問題。

          通過C的malloc() 標準庫例程或C ++的new 關鍵字創建的所有數據結構都駐留在堆中。堆是RAM中具有預定最大大小的特定區域。最初,堆中的每個分配都會減少相同字節數的剩余“可用”空間。

          例如,特定系統中的堆可能從地址開始跨越10 KB。一對4 KB數據結構的分配將留下2 KB的可用空間。

          可以通過調用free() 或使用delete 關鍵字將不再需要的數據結構的存儲返回到堆中。從理論上講,這使該存儲空間可用于后續分配期間的重用。但是分配和刪除的順序通常至少是偽隨機的,這導致堆變成一堆更小的碎片。

          若要查看碎片可能是一個問題,請考慮如果上述4 KB數據結構中的第一個空閑時會發生什么情況。現在,堆由一個4 KB的空閑塊和另一個2 KB的空閑塊組成。它們不相鄰,無法合并。所以我們的堆已經被分割了。盡管總可用空間為6 KB,但超過4 KB的分配將失敗。

          碎片類似于熵:兩者都隨時間增加。在長時間運行的系統(換句話說,曾經創建的大多數嵌入式系統)中,碎片最終可能會導致某些分配請求失敗。然后呢?您的固件應如何處理堆分配請求失敗的情況?

          最佳實踐:避免完全使用堆是防止此錯誤的肯定方法。但是,如果動態內存分配在您的系統中是必需的或方便的,則可以使用另一種結構化堆的方法來防止碎片。

          關鍵觀察是問題是由大小可變的請求引起的。如果所有請求的大小都相同,則任何空閑塊都將與其他任何塊一樣好,即使它恰巧不與任何其他空閑塊相鄰。圖3 顯示了如何將多個“堆”(每個用于特定大小的分配請求)的使用實現為“內存池”數據結構。

          讀取錯誤數據或已損壞_意外的數據包讀取錯誤_讀取意外錯誤包數據的軟件

          許多實時操作系統都具有固定大小的內存池API。如果您可以訪問其中之一,請使用它代替malloc() 和free() 。或編寫自己的固定大小的內存池API。您只需要三個函數:一個用于創建新的池(大小為M 塊N 字節);另一個分配一個塊(來自指定的池);三分之一代替free() 。

          代碼審查仍然是最佳實踐,

          可以通過首先確保系統中不存在這些錯誤來避免許多調試麻煩。最好的方法是讓公司內部或外部的人員進行全面的代碼審查。強制使用我在這里描述的最佳實踐的標準規則編碼也應該會有所幫助。如果您懷疑現有代碼中存在這些討厭的錯誤之一,那么執行代碼審查可能比嘗試從觀察到的故障追溯到根本原因要快。


          主站蜘蛛池模板: 中文字幕一区二区三区在线不卡| 日韩欧国产精品一区综合无码| 国产午夜精品一区理论片飘花 | 亚洲日韩中文字幕一区| 亚洲片国产一区一级在线观看| 国产精品无码一区二区在线观| 国产激情视频一区二区三区| 久久AAAA片一区二区| 日本精品一区二区三区在线视频一 | 91精品一区二区三区久久久久| 久久国产精品免费一区| 日韩一区二区三区在线精品| 日本免费一区二区三区最新vr| 精品一区二区三区| 夜精品a一区二区三区| 精品无人乱码一区二区三区| 亚洲性色精品一区二区在线| 亚洲综合激情五月色一区| 国内自拍视频一区二区三区| 中文激情在线一区二区| 色一情一乱一区二区三区啪啪高| 亚洲欧美日韩中文字幕一区二区三区 | 亚洲av无码一区二区三区乱子伦| 看电影来5566一区.二区| 久久精品一区二区三区不卡| 久久se精品一区二区国产| 一区二区三区亚洲| 国产一区二区久久久| 爆乳无码AV一区二区三区| 精品一区二区三区在线播放| 一区二区三区四区在线视频| 中文字幕一区二区三| 无码人妻久久一区二区三区 | 无码人妻视频一区二区三区| 无码人妻视频一区二区三区| 亚洲乱码一区av春药高潮| 免费精品一区二区三区在线观看| 国产av夜夜欢一区二区三区| 久久久不卡国产精品一区二区| 亚洲日本va午夜中文字幕一区| 国产精品香蕉一区二区三区|