一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式開(kāi)發(fā)中的C語(yǔ)言:編程思想

單片機(jī)與嵌入式 ? 來(lái)源:?jiǎn)纹瑱C(jī)與嵌入式 ? 2023-03-28 10:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

摘要:本文首先分析了C語(yǔ)言的陷阱和缺陷,對(duì)容易犯錯(cuò)的地方進(jìn)行歸納整理;分析了編譯器語(yǔ)義檢查的不足之處并給出防范措施,以Keil MDK編譯器為例,介紹了該編譯器的特性、對(duì)未定義行為的處理以及一些高級(jí)應(yīng)用;在此基礎(chǔ)上,介紹了防御性編程的概念,提出了編程過(guò)程中就應(yīng)該防范于未然的多種措施;提出了測(cè)試對(duì)編寫(xiě)優(yōu)質(zhì)嵌入式程序的重要作用以及常用測(cè)試方法;最后,本文試圖以更高的層次看待編程,討論一些通用的編程思想。

編程思想

1編程風(fēng)格

《計(jì)算機(jī)程序的構(gòu)造和解釋》一書(shū)在開(kāi)篇寫(xiě)到:程序?qū)懗鰜?lái)是給人看的,附帶能在機(jī)器上運(yùn)行。

1.1 整潔的樣式

使用什么樣的編碼樣式一直都頗具爭(zhēng)議性的,比如縮進(jìn)和大括號(hào)的位置。因?yàn)榫幋a的樣式也會(huì)影響程序的可讀性,面對(duì)一個(gè)亂放括號(hào)、對(duì)齊都不一致的源碼,我們很難提起閱讀它的興趣。我們總要看別人的程序,如果彼此編碼樣式相近,讀起源碼來(lái)會(huì)覺(jué)得比較舒適。但是編碼風(fēng)格的問(wèn)題是主觀的,永遠(yuǎn)不可能在編碼風(fēng)格上達(dá)成統(tǒng)一意見(jiàn)。因此只要你的編碼樣式整潔、結(jié)構(gòu)清晰就足夠了。除此之外,對(duì)編碼樣式再?zèng)]有其它要求。

提出匈牙利命名法的程序員、前微軟首席架構(gòu)師Charles Simonyi說(shuō):我覺(jué)得代碼清單帶給人的愉快同整潔的家差不多。你一眼就能分辨出家里是雜亂無(wú)章還是整潔如新。這也許意義不大。因?yàn)楣馐欠孔诱麧嵳f(shuō)明不了什么,它仍可能藏污納垢!但是第一印象很重要,它至少反映了程序的某些方面。我敢打賭,我在3米開(kāi)外就能看出程序拙劣與否。我也許沒(méi)法保證它很不錯(cuò),但如果從3米外看起來(lái)就很糟,我敢保證這程序?qū)懙貌挥眯?。如果?xiě)得不用心,那它在邏輯上也許就不會(huì)優(yōu)美。

1.2清晰的命名

變量、函數(shù)、宏等等都需要命名,清晰的命名是優(yōu)秀代碼的特點(diǎn)之一。命名的要點(diǎn)之一是名稱(chēng)應(yīng)能清晰的描述這個(gè)對(duì)象,以至于一個(gè)初級(jí)程序員也能不費(fèi)力的讀懂你的代碼邏輯。我們寫(xiě)的代碼主要給誰(shuí)看是需要思考的:給自己、給編譯器還是給別人看?我覺(jué)得代碼最主要的是給別人看,其次是給自己看。如果沒(méi)有一個(gè)清晰的命名,別人在維護(hù)你的程序時(shí)很難在整個(gè)全貌上看清代碼,因?yàn)橐涀∈鄠€(gè)以上的糟糕命名的變量是件非常困難的事;而且一段時(shí)間之后你回過(guò)頭來(lái)看自己的代碼,很有可能不記得那些糟糕命名的變量是什么意思。

為對(duì)象起一個(gè)清晰的名字并不是簡(jiǎn)單的事情。首先能認(rèn)識(shí)到名稱(chēng)的重要性需要有一個(gè)過(guò)程,這也許跟譚式C程序教材被大學(xué)廣泛使用有關(guān):滿(mǎn)書(shū)的a、b、c、x、y、z變量名是很難在關(guān)鍵的初學(xué)階段給人傳達(dá)優(yōu)秀編程思想的;其次如何恰當(dāng)?shù)臑閷?duì)象命名也很有挑戰(zhàn)性,要準(zhǔn)確、無(wú)歧義、不羅嗦,要對(duì)英文有一定水平,所有這些都要滿(mǎn)足時(shí),就會(huì)變得很困難;此外,命名還需要考慮整體一致性,在同一個(gè)項(xiàng)目中要有統(tǒng)一的風(fēng)格,堅(jiān)持這種風(fēng)格也并不容易。

關(guān)于如何命名,Charles Simonyi說(shuō):面對(duì)一個(gè)具備某些屬性的結(jié)構(gòu),不要隨隨便便地取個(gè)名字,然后讓所有人去琢磨名字和屬性之間有什么關(guān)聯(lián),你應(yīng)該把屬性本身,用作結(jié)構(gòu)的名字。

1.3恰當(dāng)?shù)淖⑨?/p>

注釋向來(lái)也是爭(zhēng)議之一,不加注釋和過(guò)多的注釋我都是反對(duì)的。不加注釋的代碼顯然是很糟糕的,但過(guò)多的注釋也會(huì)妨礙程序的可讀性,由于注釋可能存在的歧義,有可能會(huì)誤解程序真實(shí)意圖,此外,過(guò)多的注釋會(huì)增加程序員不必要的時(shí)間。如果你的編碼樣式整潔、命名又很清晰,那么,你的代碼可讀性不會(huì)差到哪去,而注釋的本意就是為了便于理解程序。

這里建議使用良好的編碼樣式和清晰的命名來(lái)減少注釋?zhuān)瑢?duì)模塊、函數(shù)、變量、數(shù)據(jù)結(jié)構(gòu)、算法和關(guān)鍵代碼做注釋?zhuān)瑧?yīng)重視注釋的質(zhì)量而不是數(shù)量。如果你需要一大段注釋才能說(shuō)清楚程序做什么,那么你應(yīng)該注意了:是否是因?yàn)槌绦蜃兞棵粔蚯逦蛘叽a邏輯過(guò)于混亂,這個(gè)時(shí)候你應(yīng)該考慮的可能就不是注釋?zhuān)侨绾尉?jiǎn)這個(gè)程序了。

2數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu)是程序設(shè)計(jì)的基礎(chǔ)。在設(shè)計(jì)程序之前,應(yīng)該先考慮好所需要的數(shù)據(jù)結(jié)構(gòu)。

前微軟首席架構(gòu)師Charles Simonyi:編程的第一步是想象。就是要在腦海中對(duì)來(lái)龍去脈有極為清晰的把握。在這個(gè)初始階段,我會(huì)使用紙和鉛筆。我只是信手涂鴉,并不寫(xiě)代碼。我也許會(huì)畫(huà)些方框或箭頭,但基本上只是涂鴉,因?yàn)檎嬲南敕ㄔ谖夷X海里。我喜歡想象那些有待維護(hù)的結(jié)構(gòu),那些結(jié)構(gòu)代表著我想編碼的真實(shí)世界。一旦這個(gè)結(jié)構(gòu)考慮得相當(dāng)嚴(yán)謹(jǐn)和明確,我便開(kāi)始寫(xiě)代碼。我會(huì)坐到終端前,或者換在以前的話,就會(huì)拿張白紙,開(kāi)始寫(xiě)代碼。這相當(dāng)容易。我只要把頭腦中的想法變換成代碼寫(xiě)下來(lái),我知道結(jié)果應(yīng)該是什么樣的。大部分代碼會(huì)水到渠成,不過(guò)我維護(hù)的那些數(shù)據(jù)結(jié)構(gòu)才是關(guān)鍵。我會(huì)先想好數(shù)據(jù)結(jié)構(gòu),并在整個(gè)編碼過(guò)程中將它們牢記于心。

開(kāi)發(fā)過(guò)以太網(wǎng)操作系統(tǒng)SDS 940的Butler Lampson:(程序員)最重要的素質(zhì)是能夠把問(wèn)題的解決方案組織成容易操控的結(jié)構(gòu)。

開(kāi)發(fā)CP/M操作系統(tǒng)的Gary.A:如果不能確認(rèn)數(shù)據(jù)結(jié)構(gòu)是正確的,我是決不會(huì)開(kāi)始編碼的。我會(huì)先畫(huà)數(shù)據(jù)結(jié)構(gòu),然后花很長(zhǎng)時(shí)間思考數(shù)據(jù)結(jié)構(gòu)。在確定數(shù)據(jù)結(jié)構(gòu)之后我就開(kāi)始寫(xiě)一些小段的代碼,并不斷地改善和監(jiān)測(cè)。在編碼過(guò)程中進(jìn)行測(cè)試可以確保所做的修改是局部的,并且如果有什么問(wèn)題的話,能夠馬上發(fā)現(xiàn)。

微軟創(chuàng)始人比爾**·**蓋茨:編寫(xiě)程序最重要的部分是設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)。接下來(lái)重要的部分是分解各種代碼塊。

編寫(xiě)世界上第一個(gè)電子表格軟件的Dan Bricklin:在我看來(lái),寫(xiě)程序最重要的部分是設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu),此外,你還必須知道人機(jī)界面會(huì)是什么樣的。

我們舉個(gè)例子來(lái)說(shuō)明。在介紹防御性編程的時(shí)候,提到公司使用的LCD顯示屏抗干擾能力一般,為了提高LCD的穩(wěn)定性,需要定期讀出LCD內(nèi)部的關(guān)鍵寄存器值,然后跟存在Flash中的初始值相比較。需要讀出的LCD寄存器有十多個(gè),從每個(gè)寄存器讀出的值也不盡相同,從1個(gè)到8個(gè)字節(jié)都有可能。如果不考慮數(shù)據(jù)結(jié)構(gòu),編寫(xiě)出的程序?qū)?huì)很冗長(zhǎng)。

void lcd_redu(void)  
 {
     讀第一個(gè)寄存器值;
     if(第一個(gè)寄存器值==Flash存儲(chǔ)值)
     {
         讀第二個(gè)寄存器值;
         if(第二個(gè)寄存器值==Flash存儲(chǔ)值)
         {
             ...
               
             讀第十個(gè)寄存器值;
             if(第十個(gè)寄存器值==Flash存儲(chǔ)值)
             {
                 返回;
             }
             else  
             {
                 重新初始化LCD;
             }
         }
         else  
         {
             重新初始化LCD;
         }
     }
     else  
     {
         重新初始化LCD;
     }
 }

我們分析這個(gè)過(guò)程,發(fā)現(xiàn)能提取出很多相同的元素,比如每次讀LCD寄存器都需要該寄存器的命令號(hào),都會(huì)經(jīng)過(guò)讀寄存器、判斷值是否相同、處理異常情況這一過(guò)程。所以我們可以提取一些相同的元素,組織成數(shù)據(jù)結(jié)構(gòu),用統(tǒng)一的方法去處理這些數(shù)據(jù),將數(shù)據(jù)與處理過(guò)程分開(kāi)來(lái)。

我們可以先提取相同的元素,將之組織成數(shù)據(jù)結(jié)構(gòu):

 typedef struct {  
     uint8_t  lcd_command;           //LCD寄存器  
     uint8_t  lcd_get_value[8];      //初始化時(shí)寫(xiě)入寄存器的值  
     uint8_t  lcd_value_num;         //初始化時(shí)寫(xiě)入寄存器值的數(shù)目  
 }lcd_redu_list_struct;

這里lcd_command表示的是LCD寄存器命令號(hào);lcd_get_value是一個(gè)數(shù)組,表示寄存器要初始化的值,這是因?yàn)閷?duì)于一個(gè)LCD寄存器,可能要初始化多個(gè)字節(jié),這是硬件特性決定的;lcd_value_num是指一個(gè)寄存器要多少個(gè)字節(jié)的初值,這是因?yàn)槊恳粋€(gè)寄存器的初值數(shù)目是不同的,我們用同一個(gè)方法處理數(shù)據(jù)時(shí),是需要這個(gè)信息的。

就本例而言,我們將要處理的數(shù)據(jù)都是事先固定的,所以定義好數(shù)據(jù)結(jié)構(gòu)后,我們可以將這些數(shù)據(jù)組織成表格:

 /*LCD部分寄存器設(shè)置值列表*/  
 lcd_redu_list_struct const lcd_redu_list_str[]=
 {
   {SSD1963_Get_Address_Mode,{0x20}                                   ,1}, /*1*/ 
   {SSD1963_Get_Pll_Mn      ,{0x3b,0x02,0x04}                         ,3}, /*2*/ 
   {SSD1963_Get_Pll_Status  ,{0x04}                                   ,1}, /*3*  
   {SSD1963_Get_Lcd_Mode    ,{0x24,0x20,0x01,0xdf,0x01,0x0f,0x00}     ,7}, /*4*/ 
   {SSD1963_Get_Hori_Period ,{0x02,0x0c,0x00,0x2a,0x07,0x00,0x00,0x00},8}, /*5*/ 
   {SSD1963_Get_Vert_Period ,{0x01,0x1d,0x00,0x0b,0x09,0x00,0x00}     ,7}, /*6*/ 
   {SSD1963_Get_Power_Mode  ,{0x1c}                                   ,1}, /*7*/ 
   {SSD1963_Get_Display_Mode,{0x03}                                   ,1}, /*8*/ 
   {SSD1963_Get_Gpio_Conf   ,{0x0F,0x01}                              ,2}, /*9*/ 
   {SSD1963_Get_Lshift_Freq ,{0x00,0xb8}                              ,2}, /*10* 
 }; 

至此,我們就可以用一個(gè)處理過(guò)程來(lái)完成數(shù)十個(gè)LCD寄存器的讀取、判斷和異常處理了:

 /** 
 * lcd 顯示冗余 
 * 每隔一段時(shí)間調(diào)用該程序一次 
 */  
 void lcd_redu(void)  
{
     uint8_t  tmp[8];
     uint32_t i,j;
     uint32_t lcd_init_flag;
       
     lcd_init_flag =0;
     for(i=0;i

通過(guò)合理的數(shù)據(jù)結(jié)構(gòu),我們可以將數(shù)據(jù)和處理過(guò)程分開(kāi),LCD冗余判斷過(guò)程可以用很簡(jiǎn)潔的代碼來(lái)實(shí)現(xiàn)。更重要的是,將數(shù)據(jù)和處理過(guò)程分開(kāi)更有利于代碼的維護(hù)。比如,通過(guò)實(shí)驗(yàn)發(fā)現(xiàn),我們還需要增加一個(gè)LCD寄存器的值進(jìn)行判斷,這時(shí)候只需要將新增加的寄存器信息按照數(shù)據(jù)結(jié)構(gòu)格式,放到LCD寄存器設(shè)置值列表中的任意位置即可,不用增加任何處理代碼即可實(shí)現(xiàn)!這僅僅是數(shù)據(jù)結(jié)構(gòu)的優(yōu)勢(shì)之一,使用數(shù)據(jù)結(jié)構(gòu)還能簡(jiǎn)化編程,使復(fù)雜過(guò)程變的簡(jiǎn)單,這個(gè)只有實(shí)際編程后才會(huì)有更深的理解。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5430

    瀏覽量

    123917
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7630

    瀏覽量

    140971
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3686

    瀏覽量

    95030
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1659

    瀏覽量

    50047

原文標(biāo)題:編程思想

文章出處:【微信號(hào):?jiǎn)纹瑱C(jī)與嵌入式,微信公眾號(hào):?jiǎn)纹瑱C(jī)與嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式開(kāi)發(fā)為什么選擇C++語(yǔ)言

    一、C++概述1.嵌入式開(kāi)發(fā)為什么選擇C++語(yǔ)言?(1)面向過(guò)程編程的特點(diǎn)
    發(fā)表于 10-27 08:25

    嵌入式開(kāi)發(fā)C編程技巧是什么

    c語(yǔ)言嵌入式系統(tǒng)編程技巧Let’s understand what’s an Embedded Development? 讓我們了解什么是嵌入式開(kāi)發(fā)
    發(fā)表于 12-15 08:26

    嵌入式開(kāi)發(fā)為什么選擇C語(yǔ)言?

    1、嵌入式開(kāi)發(fā)為什么選擇C語(yǔ)言?(面試題?。。。?b class='flag-5'>嵌入式開(kāi)發(fā)操作系統(tǒng)是核心,需要移植,并在上層和底層做開(kāi)
    發(fā)表于 12-15 07:45

    嵌入式c語(yǔ)言編程(由淺入深)

    本內(nèi)容詳細(xì)介紹了嵌入式c語(yǔ)言編程的各項(xiàng)知識(shí),包括嵌入式c語(yǔ)言
    發(fā)表于 11-02 14:37 ?0次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>編程</b>(由淺入深)

    Linux下C編程 嵌入式開(kāi)發(fā)

    Linux下C編程 嵌入式開(kāi)發(fā)
    發(fā)表于 10-31 09:35 ?31次下載
    Linux下<b class='flag-5'>C</b><b class='flag-5'>編程</b> <b class='flag-5'>嵌入式開(kāi)發(fā)</b>

    嵌入式開(kāi)發(fā)語(yǔ)言有哪些_最全面嵌入式開(kāi)發(fā)語(yǔ)言概述

    嵌入式開(kāi)發(fā)語(yǔ)言有哪些?嵌入式開(kāi)發(fā)的入門(mén)門(mén)檻還是比較高的,不僅要懂較底層軟件,對(duì)軟件專(zhuān)業(yè)水平要求較高,而且必須懂得硬件的工作原理,嵌入式系統(tǒng)應(yīng)用越來(lái)越廣泛,目前,在
    發(fā)表于 01-29 14:47 ?1w次閱讀
    <b class='flag-5'>嵌入式開(kāi)發(fā)</b><b class='flag-5'>語(yǔ)言</b>有哪些_最全面<b class='flag-5'>嵌入式開(kāi)發(fā)</b><b class='flag-5'>語(yǔ)言</b>概述

    嵌入式開(kāi)發(fā)通常采用哪種編程語(yǔ)言

    目前在嵌入式開(kāi)發(fā)領(lǐng)域比較常見(jiàn)的編程語(yǔ)言C,另外C++、Python、JavaScript等語(yǔ)言
    發(fā)表于 06-18 16:59 ?1.7w次閱讀

    嵌入式系統(tǒng)為什么選擇C語(yǔ)言作為開(kāi)發(fā)語(yǔ)言

    了解嵌入式開(kāi)發(fā)的朋友們都非常的清楚其核心的開(kāi)發(fā)語(yǔ)言C語(yǔ)言,C
    發(fā)表于 07-10 17:01 ?2209次閱讀

    嵌入式開(kāi)發(fā)的應(yīng)用重點(diǎn)是什么

    盡管物聯(lián)網(wǎng),嵌入式視覺(jué),機(jī)器學(xué)習(xí)和其他新興技術(shù)在開(kāi)發(fā)組織的重要性日益提高,但CC ++仍是嵌入式開(kāi)發(fā)
    發(fā)表于 12-27 16:17 ?2345次閱讀

    嵌入式開(kāi)發(fā)語(yǔ)言-C語(yǔ)言編程

    C語(yǔ)言編程概述環(huán)境在Windows上構(gòu)建C語(yǔ)言的環(huán)境安裝在Mac上構(gòu)建C
    發(fā)表于 10-20 09:59 ?17次下載
    <b class='flag-5'>嵌入式開(kāi)發(fā)</b><b class='flag-5'>語(yǔ)言</b>-<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>編程</b>

    什么是嵌入式開(kāi)發(fā)?為什么用C語(yǔ)言作為開(kāi)發(fā)語(yǔ)言?

    內(nèi)部做開(kāi)發(fā)的,而操作系統(tǒng)所有的內(nèi)核都是C語(yǔ)言所編寫(xiě)的,所以說(shuō)在嵌入式開(kāi)發(fā)的過(guò)程也選擇C
    發(fā)表于 11-02 18:50 ?12次下載
    什么是<b class='flag-5'>嵌入式開(kāi)發(fā)</b>?為什么用<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>作為<b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>語(yǔ)言</b>?

    嵌入式開(kāi)發(fā)為什么選擇C語(yǔ)言作為開(kāi)發(fā)語(yǔ)言?

    了解嵌入式開(kāi)發(fā)的朋友們都非常的清楚其核心的開(kāi)發(fā)語(yǔ)言C語(yǔ)言,C
    發(fā)表于 11-03 09:21 ?17次下載
    <b class='flag-5'>嵌入式開(kāi)發(fā)</b>為什么選擇<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>作為<b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>語(yǔ)言</b>?

    嵌入式開(kāi)發(fā)C語(yǔ)言編程思想

    使用什么樣的編碼樣式一直都頗具爭(zhēng)議性的,比如縮進(jìn)和大括號(hào)的位置。因?yàn)榫幋a的樣式也會(huì)影響程序的可讀性,面對(duì)一個(gè)亂放括號(hào)、對(duì)齊都不一致的源碼,我們很難提起閱讀它的興趣。
    的頭像 發(fā)表于 04-08 11:03 ?2132次閱讀

    嵌入式開(kāi)發(fā)為什么選擇C語(yǔ)言?它有哪些特點(diǎn)?

    眾所周知,C語(yǔ)言嵌入式開(kāi)發(fā)占據(jù)著十分重要的地位,為什么嵌入式開(kāi)發(fā)要選擇C
    的頭像 發(fā)表于 01-04 09:56 ?1546次閱讀
    <b class='flag-5'>嵌入式開(kāi)發(fā)</b><b class='flag-5'>中</b>為什么選擇<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>?它有哪些特點(diǎn)?

    c語(yǔ)言嵌入式開(kāi)發(fā)

    電子發(fā)燒友網(wǎng)站提供《c語(yǔ)言嵌入式開(kāi)發(fā).zip》資料免費(fèi)下載
    發(fā)表于 11-17 14:11 ?4次下載
    <b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>嵌入式開(kāi)發(fā)</b>