架构与设计 之一 C 嵌入式设计模式(Design Patterns for Embedded Systems in C)的学习记录
唉
??時至今日,已經(jīng)不知道在嵌入式的道路上到底掙扎了多少個歲月,總感覺要“病入膏肓”了。此間總是不時出現(xiàn)一些疑惑:人家搞 Java、搞 C# 的動不動就是什么架構(gòu) / 框架的,搞了這么久的的嵌入式,我到底搞了什么?架構(gòu) / 框架統(tǒng)統(tǒng)木聽說過。。。似乎那些高大上的東西都是針對上層編程的!難道嵌入式就這么 Low 么?
??最近終于靜下心來,有功夫拜讀 Bruce Powel Douglass 的《Design Patterns for Embedded Systems in C》。在書中發(fā)現(xiàn)了不少更加系統(tǒng)化的東西,一些在實際工作中用到的但是不知道其準確定義的東西!但是,也同時發(fā)現(xiàn),好多東西完全看不懂。。。以下內(nèi)容主要是邊讀邊記錄的一些自己感覺有用的知識點,除此之外沒有任何意義!此外,在這本書中,作者都是以面向?qū)ο蟮乃枷雭磉M行舉例說明的。如果你是一個純嵌入式底層人員,對于面向?qū)ο罂赡苡行┠吧?br /> ??最開始看的是這本書的中文翻譯版,但是里面有些翻譯看不懂。可能是個人水平太低,還沒有理解那些高深的東西吧!而后直接去看了英文原版。因此,該文的學習記錄都是基于英文原版的。具體為:英文原版內(nèi)容都是 英文 +(翻譯) 的形式給出,其他內(nèi)容都是我自己的一些理解。其中有些部分確實不懂,均已 ??處理。
CHAPTER 1 What Is Embedded Programming?
1.1 What’s Special About Embedded Systems?
??我們常說嵌入式系統(tǒng),那什么是嵌入式系統(tǒng)?作者給出的定義:“a computerized system dedicated to performing a specific set of real-world functions, rather than to providing a generalized computing environment.(一個旨在處理現(xiàn)實世界中的具體功能的計算機系統(tǒng),而不是提供通用的計算機環(huán)境的系統(tǒng))”。我們生活中常見到的非 PC 參與的計算機系統(tǒng)基本都屬于嵌入式系統(tǒng)。
??An important subset of embedded systems are real-time systems(實時系統(tǒng)是嵌入式系統(tǒng)的一個重要子集). Many people have the mistaken impression that “real time” means “real fast” but that is not true(很多人錯誤的認為“實時”就是“真正的快”,這是不正確的). A real-time system is one in which timeliness constraints must be satisfied for system correctness(實時系統(tǒng)是為了保證系統(tǒng)的正確性而必須滿足時效性約束的系統(tǒng)). A common, if simplistic, categorization of real-time systems is into two groups(實時系統(tǒng)可簡單的分為兩大類). “Hard” real-time systems(“硬”實時系統(tǒng)) are ones in which timeliness constraints are modeled as deadlines, points in time by which the execution of specific actions are required to be complete(完全以時間作為實時性約束條件,時間到之前必須完成指定動作). “Soft” real-time systems(“軟”實時系統(tǒng)) are those that are not “hard”; that is, some other(usually stochastic) measure than deadlines is used to determine timeliness(引入除時間限制外的其他實時性約束條件). This may include average throughput(平均吞吐量), average execution time(平均執(zhí)行時間), maximum burst length(最大脈沖長度), or some other measure. All systems may be modeled as hard real-time systems, but this often results in “over-designing” the system to be faster or have more available resources than is necessary, raising the recurring cost(approximately “manufacturing cost”) of the system.
1.1.1 Embedded Design Constraints
??From the inside, one of the most striking characteristics of embedded systems is severity of their constraints(從內(nèi)部來看,嵌入式系統(tǒng)的一個顯著地特點就是嚴格的約束條件).
??Reliability, robustness, and safety are other kinds of constraints levied on embedded systems(可靠性、健壯性、安全性是嵌入式系統(tǒng)需要遵循的另一些約束條件).
1.1.3 OS, RTOS, or Bareback?
??在嵌入式系統(tǒng)中,我們可以選擇使用操作系統(tǒng)來實現(xiàn),也可以直接以裸機的形式來實現(xiàn)。嵌入式系統(tǒng)中,經(jīng)常的系統(tǒng)都是實時操作系統(tǒng)(real-time operating system,RTOS)。實時操作系統(tǒng)(RTOS)是一種用于實時和嵌入式應用的多任務操作系統(tǒng)。
??RTOSs run applications and tasks using one of three basic design schemas(實時操作系統(tǒng)使用三種基本設計模式之一運行應用程序和任務). Event-driven systems handle events as they arise and schedule tasks to handle the processing(事件驅(qū)動的系統(tǒng)通過任務調(diào)度器來處理出現(xiàn)的多個任務). Most such systems use task priority as a quantitative means by which to determine which task will run if multiple tasks are ready to run(通過任務優(yōu)先級來決定哪個就緒的任務來運行). Task priorities are most often static(任務優(yōu)先級通常為靜態(tài)的)(i.e., specified at design time as such with rate-monotonic scheduling) but some are dynamic(也有動態(tài)的), varying the task priorities to account for current operating conditions(such as earliest deadline first scheduling*). The other two approaches to task scheduling implement a “fairness doctrine” either by giving all tasks a periodic time slice in which to run(time-base schemas, such as ***round robin scheduling(輪詢調(diào)度)***) or by running the task set cyclically(sequence-based schemas, such as cyclic executive scheduling).
1.1.4 Embedded Middleware
??中間件在實際工作中,還是經(jīng)常用到的!在嵌入式中,RTOS 通常僅僅實現(xiàn)與 RTOS 相關(guān)的功能,其他的組件,例如網(wǎng)絡協(xié)議棧、文件系統(tǒng)等則通常是有其他實現(xiàn)方式的。這行統(tǒng)統(tǒng)都可以稱為中間件。
1.1.5 Codevelopment with Hardware
嵌入式系統(tǒng)的開發(fā)一個顯著的特點就是需要與硬件進行協(xié)同開發(fā)。任何硬件的變動都可能導致之前設計的軟件架構(gòu)的變動。
1.1.6 Debugging and Testing
??嵌入式系統(tǒng)開發(fā)的一個難點就是在指定硬件上進行調(diào)試。The state of the art in developing defect-free software is an agile practice known as **test-driven development(TDD)(開發(fā)沒有缺陷的軟件的最先進的方法被稱為測試驅(qū)動開發(fā)(TDD)). In TDD, the unit tests for a piece of software are written simultaneously with, or even slightly before, the software it will verify(在 TDD 中,單元測試程序要與主程序同時編寫,甚至提前編寫). All too commonly, unit testing is skipped entirely or performed far too late to have any beneficial effect on the software(通常情況下,單元測試被完全跳過,或者執(zhí)行得太晚,對軟件沒有任何有益的影響。).
??There are many different kinds of unit tests that can be applied to software in general and embedded software in particular. These include(有許多不同類型的單元測試可以應用于一般的軟件,特別是嵌入式軟件。具體如下):
- Functional(功能) – tests the behavior or functionality of a system or system element(測試系統(tǒng)或系統(tǒng)元素的行為或功能)
- Quality of Service(服務質(zhì)量) – tests the “performance” of a system or system element, often to measure the performance of the system or element against its performance requirements(測試系統(tǒng)或系統(tǒng)元素的“性能”,通常是根據(jù)其性能需求來度量系統(tǒng)或元素的性能)
- Precondition tests(先決條件) – tests that the behavior of the system or system element is correct in the case that the preconditional invariants are met and in the case that the preconditional invariants are violated(在滿足前置條件不變量的情況下以及在違反前置條件不變量的情況下,測試系統(tǒng)或系統(tǒng)元素的行為是否正確)
- Range(區(qū)間) – tests values within a data range(測試數(shù)據(jù)范圍內(nèi)的值)
- Statistical(統(tǒng)計) – tests values within a range by selecting them stochastically from a probability density function(PDF) (通過從概率密度函數(shù)中隨機選擇值來測試一定范圍內(nèi)的值(PDF))
- Boundary(邊界) – tests values just at the edges of, just inside, and just outside a data range(測試區(qū)間邊界內(nèi)、邊界上及邊界外的值)
- Coverage(覆蓋率) – tests that all execution paths are executed during a test suite(測試在測試集中執(zhí)行所有執(zhí)行路徑)
- Stress(壓力) – tests data that exceeds the expected bandwidth of a system or system element
- Volume(容積) – also known as “l(fā)oad testing(負載測試)” – tests the system with large amounts of data that meet or exceed its design load
- Fault Seeding(故障播種) – tests in which a fault is intentionally introduced to the system to ensure the system handles it properly(故意將故障引入系統(tǒng)以確保系統(tǒng)正確處理故障的測試)
- Regression tests(回歸測試) – normally a subset of previously passed tests to ensure that modification to a system did not introduce errors into previously correctly functioning systems(通常是先前通過的測試的子集,以確保對系統(tǒng)的修改不會將錯誤引入先前正確運行的系統(tǒng))
??即使實在桌面系統(tǒng)(如 Windows)中,測試用例要涵蓋以上所有的這些點也是非常困難。在嵌入式平臺上就更加困難了。在嵌入式平臺我們可以通過以下方式來進行測試:
- “printf” testing(“printf” 測試) – tests the system by writing to a file or to stdout(通過寫入文件或stdout來測試系統(tǒng))
- “Test buddies(測試伙伴)” – writing test fixtures that embed the test cases in their own functionality
- Testing on host(在主機上測試) – performing most of the tests on the host platforms using a host native complier and a critical subset on the target platform using a cross compiler( 在主機平臺上使用主機原生編譯器執(zhí)行大多數(shù)測試,并在目標平臺上使用交叉編譯器執(zhí)行一個關(guān)鍵的子集)
- Simulating on host(在主機上模擬 ) – simulating the target platform on the host with cross-compiled software and retesting a critical subset on the target with the same object code(使用交叉編譯軟件在主機上模擬目標平臺,并使用相同的目標代碼在目標上重新測試一個關(guān)鍵子集)
- Commercial software testing tools(商業(yè)軟件測試工具) – using software testing tools, such as TestRT?, LDRA?, or VectorCAST?(使用軟件測試工具,如TestRT?,LDRA? 或 VectorCAST?)
- Commercial hardware-software integrated tools(商業(yè)軟硬件集成工具) – this includes tools such as logic analyzers, in-circuit emulators, JTAG-compliant testing tools, and ROM emulators(其中包括邏輯分析儀,在線仿真器,符合 JTAG 標準的測試工具和 ROM 仿真器等工具)
Of the various kinds of tests, performance tests are usually the most difficult to adequately perform(在各種測試中,性能測試通常是最難以充分執(zhí)行的).
1.2 OO or Structured – It’s Your Choice
Structured programming(結(jié)構(gòu)化編程):Structured programming is a disciplined form of software development that emphasizes two separate and distinct aspects(結(jié)構(gòu)化編程是一種規(guī)范的軟件開發(fā)形式,強調(diào)兩個獨立且不同的方面。).
- On one hand, functions or procedures form the foundation of behavioral programming(函數(shù)和過程形成基本的編程基礎)
- The other side of structured programming is the notion of data structuring(數(shù)據(jù)的結(jié)構(gòu)化).
OO(面向?qū)ο?#xff09;:Object-oriented programming is based on an orthogonal paradigm(面向?qū)ο缶幊淌腔谡环妒降?#xff09;. Rather than have two separate taxonomies, object-oriented programming has a single one based on the notion of a class(面向?qū)ο缶幊虥]有兩個單獨的分類法,而是基于類的概念有一個單獨的分類法。).
(1)這本書采用了基于面向?qū)ο蟮木幊趟枷?#xff0c;因此后續(xù)章節(jié)講了如何用 C 語言來模擬面向?qū)ο蟮乃枷搿?br /> (2)基本的模擬方法就是用結(jié)構(gòu)體來封裝數(shù)據(jù)和方法(函數(shù)指針)
(3)如果想要詳細了解C實現(xiàn)面向?qū)ο蟮乃枷?#xff0c;光看本書這一點章節(jié)中的東西是遠遠不夠的!
CHAPTER 2 Embedded Programming with The HarmonyTMHarmony^{TM}HarmonyTM for Embedded RealTime Process
??整個第二章主要就是以作者自己搞得 Harmony? for Embedded RealTime 為例,來講解如何進行嵌入式系統(tǒng)設計。
2.1.2 What Is a Design Pattern?
??A design pattern is “a generalized solution to a commonly occurring problem.”(設計模式是對經(jīng)常出現(xiàn)的問題的通解)To be a pattern, the problem must recur often enough to be usefully generalizable and the solution must be general enough to be applied in a wide set of application domains. If it only applies to a single application domain, then it is probably an analysis pattern5. Analysis patterns define ways for organizing problem-specific models and code for a particular application domain.
2.1.3 Basic Structure of Design Patterns
According to Gamma, et. al.6, a pattern has four important aspects:
- Name:The name provides a “handle” or means to reference the pattern.
- Purpose:The purpose provides the problem context and the QoS aspects the pattern seeks to optimize. The purpose identifies the kinds of problem contexts where the pattern might be particularly appropriate.
- Solution:The solution is the pattern itself.
- Consequences:The consequences are the set of pros and cons of the use of the pattern.
CHAPTER 3 Design Patterns for Accessing Hardware
3.1 Basic Hardware Access Concepts(基本的硬件訪問概念)
??整個第三章主要講了各種訪問硬件的設計模式。Probably the most distinguishing property of embedded systems is that they must access hardware directly(嵌入式系統(tǒng)最顯著的特性可能是它們必須直接訪問硬件). Broadly, software-accessible hardware can be categorized into four kinds – infra-structure, communications, sensors, and actuators(大體上,嵌入式軟件可訪問的硬件可以分為四類:基礎設施、通信、傳感器和致動器).
- 基礎設施:Infrastructure hardware refers to the computing infrastructure and devices on which the software is executing(基礎設施硬件是指軟件正在其上執(zhí)行的計算基礎設施和設備。).
- 通信:Communications hardware refers to hardware used to facilitate communication between different computing devices, such as standard (nonembedded) computers, other embedded systems,sensors, and actuators(通信硬件是指用于促進不同計算設備之間的通信的硬件,例如標準(非嵌入式)計算機,其他嵌入式系統(tǒng),傳感器和致動器).
- 傳感器:Sensors use electronic, mechanical, or chemical means for monitoring the status of physical phenomena, such as the rate of a heart beat, position of an aircraft, the mass of an object, or the concentration of a chemical(傳感器使用電子、機械或化學手段來監(jiān)測物理現(xiàn)象的狀態(tài),例如心跳速率,飛機位置,物體質(zhì)量或化學物質(zhì)濃度。).
- 致動器:Actuators, on the other hand, change the physical state of some real-world element(致動器改變了某些現(xiàn)實世界元素的物理狀態(tài)). Typical actuators are motors, heaters, generators, pumps, and switches.
??Let’s turn our attention now to a number of design patterns that have proven themselves useful for the manipulation of hardware(開始介紹設計模式). The Hardware Proxy Pattern, discussed next, is an archetypal pattern for the abstraction of hardware for the purpose of encapsulating details that are likely to change from the usage of the information provided to or by the hardware(接下來討論的硬件代理模式是以封裝詳細信息為目的的硬件抽象模式的一個比較典型的模式,這里沒明白!). The Hardware Adapter Pattern extends the Hardware Proxy Pattern to provide the ability to support different hardware interfaces(硬件適配模式主要是擴展硬件代理抹模式,以提供支持不同硬件接口的能力). The Mediator Pattern supports coordination of multiple hardware devices to achieve a system level behavior(中介模式支持多個硬件設備的協(xié)調(diào)以實現(xiàn)系統(tǒng)級行為). The Observer Pattern is a way of distributing sensed data to the software elements that need it(觀察者模式是將感測數(shù)據(jù)分發(fā)給需要它的軟件元素的一種方式). The Debouncing and Interrupt Patterns are simple reusable approaches to interface with hardware devices(去抖動和中斷模式是與硬件設備接口的簡單可重用方法). The Timer Interrupt Pattern extends the Interrupt timer to provide accurate timing for embedded systems(定時器中斷模式擴展了中斷定時器,為嵌入式系統(tǒng)提供準確的定時).
3.2 Hardware Proxy Pattern(硬件代理模式)
??The Hardware Proxy Pattern creates a software element responsible for access to a piece of hardware and encapsulation of hardware compression and coding implementation(硬件代理模式創(chuàng)建一個軟件元素,負責訪問硬件并封裝硬件壓縮和編碼實現(xiàn)).
3.3 Hardware Adapter Pattern(硬件適配模式)
The Hardware Adapter Pattern provides a way of adapting an existing hardware interface into the expectations of the application. This pattern is a straightforward derivative of the Adapter Pattern(硬件適配器模式提供了一種使現(xiàn)有硬件接口適應應用程序期望的方法。 此模式是適配器模式的直接派生).
3.3.7 Related Patterns
??The Hardware Adapter Pattern extends the Hardware Proxy Pattern to provide the ability to support different hardware interfaces(硬件適配器模式擴展了硬件代理模式,以提供支持不同硬件接口的能力). The implementation of the Hardware Proxy and the Hardware Adapter can be merged, but that undermines the reusability of the Hardware Proxy(硬件代理和硬件適配器的實現(xiàn)可以合并,但是這會破壞硬件代理的可重用性).
3.4 Mediator Pattern(中介者模式)
??The Mediator Pattern provides a means of coordinating a complex interaction among a set of elements(中介模式提供了一種協(xié)調(diào)一組元素之間復雜交互的方法).
??The Mediator Pattern supports coordination of multiple hardware devices to achieve a system level behavior(中介模式支持多個硬件設備之間的協(xié)調(diào),以實現(xiàn)系統(tǒng)級行為).
3.4.3 Pattern Structure
The Mediator Pattern uses a mediator class to coordinate the actions of a set of collaborating devices to achieve the desired overall effect(中介模式使用中介類來協(xié)調(diào)一組協(xié)作設備的操作,以達到預期的總體效果。). The Mediator class coordinates the control of the set of multiple Specific Collaborators (their number is indicated by the ‘*’ multiplicity on the association between the Mediator and the Specific Collaborator in Figure 3-5). Each Specific Collaborator must be able to contact the Mediator when an event of interest occurs.
3.5 Observer Pattern(觀察者模式)
??The Observer Pattern is a way of distributing sensed data to the software elements that need it.
??The Observer Pattern is one of the most common patterns around. When present, it provides a means for objects to “l(fā)isten in” on others while requiring no modifications whatsoever to the data servers. In the embedded domain, this means that sensor data can be easily shared to elements that may not even exist when the sensor proxies are written.
Debouncing Pattern(去抖模式)
??This simple pattern is used to reject multiple false events arising from intermittent contact of metal surfaces.
??Push buttons, toggle switches, and electromechanical relays are input devices for digital systems that share a common problem – as metal connections make contact, the metal deforms or “bounces”, producing intermittent connections during switch open or closure. Since this happens very slowly(order of milliseconds) compared to the response speed of embedded systems(order of microseconds or faster), this results in multiple electronic signals to the control system. This pattern addresses this concern by reducing the multiple signals into a single one by waiting a period of time after the initial signal and then checking the state(嵌入式的許多輸入設備,例如按鍵、開關(guān)等受制于物理限制,其響應速度與嵌入式設備處理速度不是一個數(shù)量級)


Interrupt Pattern(中斷模式)
??The physical world is fundamentally both concurrent and asynchronous; it’s nonlinear too, but that’s a different story. Things happen when they happen and if your embedded system isn’t paying attention, those occurrences may be lost. Interrupt handlers(a.k.a. Interrupt Service Routines, or ISRs) are a useful way to be notified when an event of interest occurs even if your embedded system is off doing other processing.

Polling Pattern(輪詢模式)
??Another common pattern for getting sensor data or signals from hardware is to check periodi-cally, a process known as polling(通過周期性訪問來獲取數(shù)據(jù),即為輪詢). Polling is useful when the data or signals are not so urgent that they cannot wait until the next polling period to be received or when the hardware isn’t capable of generating interrupts when data or signals become available(非緊急性數(shù)據(jù)或沒有中斷時,該模式非常有用!).
??This pattern comes in two flavors(這個模式有兩種版本). Figure 3-17 shows the pattern structure for opportunistic polling(機會輪詢) while Figure 3-18 shows the pattern for periodic polling(周期輪詢). The difference is that in the former pattern the applicationFunction will embed calls to poll() when convenient, and in the latter, a timer is created to start polling(區(qū)別是:前者是在何時的實際去輪詢,而后者則是在定時器中輪詢).


??Periodic polling is a special case of the Interrupt Pattern(周期輪序時中斷模式的一個特殊情況). In addition, the hardware checks may be done by invoking data acquisition services of Hardware Proxies or Hardware Adapters. In addition, the Observer Pattern can be merged in as well, with the polling element(Opportu-nisticPoller or PeriodicPoller) serving as the data server and the PollDataClients serving as the data clients.
CHAPTER 4 Design Patterns for Embedding Concurrency and Resource Management
先跳過,看看后面的狀態(tài)機
CHAPTER 5 Design Patterns for State Machines
5.1 Oh Behave!
??Behavior can be defined as a change in condition or value over time(行為可以定義為條件或值隨時間的變化). It is often a response to an external event or request, but autonomous systems decide for themselves when and how to behave(它通常是對外部事件或請求的響應,但自治系統(tǒng)自行決定何時以及如何表現(xiàn)。). 本書中將行為分為四類:
- 簡單行為: Simple behavior is behavior independent of any history of the object or system(簡單行為是與對象或系統(tǒng)的任何歷史無關(guān)的行為). 書中給出的例子是:計算 cos(π / 4) 。
- 連續(xù)行為: Continuous behavior, on the other hand, does rely upon the history of the object or system(另一方面,連續(xù)行為確實依賴于對象或系統(tǒng)的歷史。). 書中給出的例子是:移動平均數(shù)字濾波器的計算 和 比例積分微分(Proportional Integral-Differential,PID)如下圖:
- 狀態(tài)行為(不連續(xù)行為): The third kind of behavior, to which this is dedicated, is discontinuous or stateful behavior(第三種行為是不連續(xù)的行為或者稱為狀態(tài)行為。).In stateful systems. the behavior depends on the new data (typically incoming events of interest) and the current state of the system, which are determined by that system’s history(在有狀態(tài)系統(tǒng)中, 行為取決于新數(shù)據(jù)(通常是感興趣的傳入事件)并且系統(tǒng)的當前狀態(tài)由系統(tǒng)的歷史決定). However, the difference is the kind of actions the system performs not the value of the outputs( 但是,不同之處在于系統(tǒng)執(zhí)行的操作類型而不是輸出值。).本書中給出的例子是微波爐狀態(tài)機,如下圖:
The state machine may also be visualized as a state x transition table(狀態(tài)機也可以可視化為狀態(tài)x轉(zhuǎn)換表),如下圖:
- 分段連續(xù)行為: Lastly, the fourth type of behavior is a combination of the previous two, known as piece-wise continuous behavior (see Figure 5.3)(最后,第四種行為是前兩種行為的組合,稱為分段連續(xù)行為(見圖5.3)。). In PC behavior, within a state, continuous (and, for that matter, simple) the behaviors that occur are of the same kind, but between states, different kinds of behaviors occur. A simple example of this is using different sets of differential equations depending on the state of the system.
5.2 Basic State Machine Concepts(基本狀態(tài)機概念)
??A Finite State Machine(FSM) is a directed graph composed of three primary elements: states, transitions, and actions(有限狀態(tài)機(FSM)是由三個主要元素組成的有向圖:狀態(tài),轉(zhuǎn)換和動作). A state is a condition of a system or element(usually a class in an object-oriented system)(狀態(tài)是系統(tǒng)或元素的狀態(tài)(通常是面向?qū)ο笙到y(tǒng)中的類)).
??A transition is a path from one state to another, usually initiated by an event of interest(轉(zhuǎn)換是從一個狀態(tài)到另一個狀態(tài)的路徑,通常由感興趣的事件啟動); it connects a predecessor state with a subsequent state when the element is in the predecessor state and receives the triggering event.
??The actual behaviors executed by the element are represented in actions(實際的動作通過代表動作的元素來執(zhí)行).
5.3 Single Event Receptor Pattern
??Single event receptor state machines(henceforth known as SERSMs,單事件接收器狀態(tài)機) can be used for both synchronous and asynchronous events(同時用于同步事件和異步事件).
5.4 Multiple Event Receptor Pattern
??Multiple event receptor finite state machines(MERSMs,多事件接收器狀態(tài)機) are generally only used for synchro-nous state machines(通常用于同步事件狀態(tài)機) because the client is often aware of the set of events that it might want to send to the server state machine. In this pattern, there is a single event receptor for each event sent from the client.
未完待續(xù)。。。。
總結(jié)
以上是生活随笔為你收集整理的架构与设计 之一 C 嵌入式设计模式(Design Patterns for Embedded Systems in C)的学习记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM 之四 各集成开发环境(IDE)说
- 下一篇: STM32 之七 备份域(备份寄存器、备