女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

嵌入式系統(tǒng)簡易版本的printf滿足自己的需要

電子設計 ? 來源:博客園 ? 作者:佚名 ? 2020-09-03 17:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式中,調(diào)試手段通常有兩種,一是遠程gdb,一是直接printf。如果是調(diào)試自己玩的小板子,用gdb有點大張旗鼓了,大多數(shù)情況下printf就可以搞定。不過printf的問題是stdiolib的size太大,稍微有點程序,加上幾個常用的庫,比如stdio和string,超過16k甚至32k(已經(jīng)大于一些低端芯片的flash容量了)是很正常的事情,而且通常比較慢,程序越多,越麻煩。道理很簡單,標準C語言庫的規(guī)范中,Printf()必須處理大量的數(shù)據(jù)格式,包括字符串、字符、(各種長度的有符號和無符號)數(shù)字,以及浮點值。而且格式字符串還要包括用于更改文本對齊、基數(shù)、間距、字段寬度和精度的調(diào)節(jié)器和指示器。符合這個規(guī)范的代碼必然會是冗長和繁重的。一些嵌入式系統(tǒng)庫倒是提供了一些之針對整數(shù)的printf,但還是有問題,首先是還是太大,其次是你沒有自己的調(diào)整權限。

其實printf也就是IO的調(diào)用包裝而已,我們完全可以自己寫一個簡易版本的printf滿足自己的需要,并隨時根據(jù)需要裁剪。具體來說,printf在這里要起的作用就是將調(diào)試字符串從嵌入式目標空閑的串口壓出,并在運行于宿主工作站的終端模擬器上顯示結(jié)果。下面就簡單介紹一下,如何來自己寫一個簡易printf函數(shù)。

要寫printf,首先要知道什么是可變參數(shù)傳遞,我們來看看標準庫里面,是如何定義可變參數(shù)實現(xiàn)的:

#define _AUPBND (sizeof (acpi_native_int) - 1)

#define _ADNBND (sizeof (acpi_native_int) - 1)

#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd)))

#define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T,_AUPBND))) - (_bnd (T,_ADNBND))))

#define va_end(ap) (void) 0

#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) +(_bnd(A,_AUPBND))))

關于可變參數(shù)的原理,網(wǎng)上有一些文章,總結(jié)來說,就是我們可以通過Intel80×86機器的對齊特性來獲得所有的參數(shù),因為在Intel80×86機器上,每個變量的地址都要是sizeof(int)的倍數(shù),這樣能提升CPU運行的效率。也就是說,所有參數(shù)的首地址都要是4的倍數(shù),就算你是char型的,那浪費3個byte也要安排你占第四個坑。

好,由于C語言傳遞參數(shù)時是用push指令從右到左將參數(shù)逐個壓棧,因此我們通過棧指針跳4n格來訪問第n個參數(shù),不要忘了,參數(shù)的地址都是字對齊的。這里,我們用#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) &(~(bnd)))來計算類型為X的參數(shù)在棧中占據(jù)的字對齊后的字節(jié)數(shù)。bnd是sizeof (acpi_native_int) –1,acpi_native_unit在32位機的定義是:

typedef u32 acpi_native_uint;

所以( ~(bnd))就是0xfffffffc 。 因此,_bnd(X,bnd) 宏在32位機下就是

( (sizeof(X) + 3)&0xfffffffc )

很明顯,其作用是–倘若sizeof(X)不是4的整數(shù)倍,將其變?yōu)?的整數(shù)倍。

va_start(ap,A) 負責初始化參數(shù)指針ap,將函數(shù)參數(shù)A右邊第一個參數(shù)的地址賦給ap,這個第一個參數(shù)通常就是printf里面的”%x%d%f%d”。

va_arg(ap,T) 可以獲得ap指向參數(shù)的值,并使ap指向下一個參數(shù),T用來指明當前參數(shù)類型。

在這里,上述代碼還是麻煩,而且sizeof我們也不能直接用,所以我們不如干脆直接寫一個不那么麻煩而有針對性的可變參數(shù)操作定義:

有了這幾個定義,print函數(shù)就好寫了,為了節(jié)省空間,這個簡單的print()只支持“%s”,“%d”和”%c”格式的分類符,暫時不需要其他功能,比如格式對齊之類的,當然,可以根據(jù)自己的需要擴展這個函數(shù)。

int print( const char *fmt, 。.. )

{

const char *s;

char c;

int d;

va_list ap;

va_start(ap, fmt);

while( *fmt != ‘\0’ )

{

if( *fmt != ‘%’ )

{

uart_putc(*fmt++);

continue;

}

switch(*++fmt)

{

case ‘s’:

{

s = va_arg(ap, const char *);

uart_puts(s);

break;

}

case ‘d’:

{

d = va_arg(ap, int);

uart_putints(d, 10);

break;

}

case ‘c’:

{

c = va_arg(ap, char);

uart_putc(c);

break;

}

default:

uart_putc(*fmt);

}

fmt++;

}

va_end(ap);

return 1;

}

這里面有一些函數(shù),uart_putc是串口驅(qū)動程序,給串口送東西的,uart_puts是簡單的多重putc包裝。uart_putints則需要做一些atoi的轉(zhuǎn)換,一個比較簡單但是有效的atoi程序宏定義如下:

#define ATOI(X, result) \

do{ \

char *lptr = X; \

result = 0; \

while (1) \

{ \

if ((*lptr 》= ‘0’) && (*lptr 《= ‘9’)) \

{ \

result *= 10; \

result += *lptr - ‘0’; \

lptr++; \

} \

else \

{ \

break; \

} \

} \

}while(0)

責任編輯:gt

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

    關注

    5152

    文章

    19672

    瀏覽量

    317534
  • C語言
    +關注

    關注

    180

    文章

    7632

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    信號處理原理-簡易版

    信號處理原理-簡易版主要內(nèi)容信號的分類與定義隨機信號與確定性信號連續(xù)信號與離散信號周期信號與非周期信號確定性信號的特性時間特性頻率特性時間與頻率的聯(lián)系確定性信號分析時域分析頻域分析隨機信號特性及分析 [hide][/hide]
    發(fā)表于 11-04 10:16

    什么是嵌入式系統(tǒng)

    ,尤其是用于便攜的無線及移動的計算和通信設備中靠電池供電的嵌入式系統(tǒng)更是如此,如需要功耗只有mW甚至μW級。
    發(fā)表于 08-12 14:37

    如何學習嵌入式系統(tǒng)

    這段時間很多關注者問起怎樣學習嵌入式,對于一個剛開始接觸嵌入式的朋友來說,這的確是個問題。在這里筆者就給大家講講怎樣利用【IT指路燈】來學習嵌入式系統(tǒng)。  學習
    發(fā)表于 08-17 10:18

    FAT精減版(嵌入式應用的版本)--嵌入式FAT文件系統(tǒng)源碼免費下載

    FAT精減版(嵌入式應用的版本)--嵌入式FAT文件系統(tǒng)源碼免費下載本文件系統(tǒng)代碼兼容FAT16/FAT32兩種文件
    發(fā)表于 08-02 07:45

    嵌入式操作系統(tǒng)有哪些

    自己需要嵌入式系統(tǒng)?! ∑浯?,Linux具有強大的網(wǎng)絡支持功能。Linux誕生于因特網(wǎng)并具有UNIX的特性,這就保證了它支持所有標準因特網(wǎng)協(xié)議,并且可以利用Linux的網(wǎng)絡協(xié)議棧開發(fā)
    發(fā)表于 06-20 15:13

    什么是嵌入式系統(tǒng)

    系統(tǒng)的核心課程,或者就講一下ARM編程基礎;做嵌入式實驗大部分也只是教學系統(tǒng)里現(xiàn)有的實驗程序調(diào)出來運行驗證一下結(jié)果,屬于驗證性實驗,很多學生做完了實驗都不知道自己做了什么。根本就沒有機
    發(fā)表于 04-17 11:46

    如何滿足嵌入式系統(tǒng)的靈活需求?

    嵌入式程序開發(fā)基本概念如何滿足嵌入式系統(tǒng)的靈活需求開發(fā)高效程序的技巧是什么
    發(fā)表于 04-28 06:07

    單片機實現(xiàn)簡易版shell的方法和原理是什么

    力氣將其移植出來.于是我就自己寫了一個類似于這樣的插件.只需要把一對.c/.h文件加入到你的工程,就可以實現(xiàn)這個簡易版的shell.git: https://github.com/KimAlittleS...
    發(fā)表于 12-09 07:27

    什么是嵌入式系統(tǒng)?深嵌入式系統(tǒng)又是什么

    和Android的系統(tǒng)也可以稱為嵌入式系統(tǒng)。但是通常,這些通用操作系統(tǒng)需要應用程序處理器,并具有其他功能,例如動態(tài)應用程序加載。這就是為什么
    發(fā)表于 12-21 06:48

    嵌入式系統(tǒng)是否需要操作系統(tǒng)

    嵌入式操作系統(tǒng)嵌入式應用系統(tǒng)軟件運行的管理內(nèi)核,嵌入式編程的大多數(shù)問題可以因為使用操作系統(tǒng)而獲
    發(fā)表于 04-14 17:15 ?34次下載

    如何開發(fā)自己嵌入式系統(tǒng)

            如何開發(fā)自己嵌入式系統(tǒng) 嵌入式系統(tǒng)的悠久歷史 電
    發(fā)表于 04-02 23:46 ?1010次閱讀

    學習嵌入式系統(tǒng)需要涉及哪些工作

      同學們在學習嵌入式的過程中要涉及很多內(nèi)容,就嵌入式系統(tǒng)的設計和實現(xiàn)而言,基本上需要四種不同的工作:系統(tǒng)設計工作,硬件設計工作,驅(qū)動程序和
    發(fā)表于 10-15 10:17 ?545次閱讀

    嵌入式Linux中printf重定向到串口

    PC機上,printf輸出到顯示設備,在嵌入式linux系統(tǒng),一般利用printf輸出調(diào)試信息,需要重定向到串口。以AT91RM9200為例
    發(fā)表于 11-01 17:22 ?24次下載
    <b class='flag-5'>嵌入式</b>Linux中<b class='flag-5'>printf</b>重定向到串口

    號稱目前網(wǎng)上嵌入式最好的printf,用起來!

    號稱目前網(wǎng)上嵌入式最好的printf,用起來!
    發(fā)表于 12-09 10:51 ?11次下載
    號稱目前網(wǎng)上<b class='flag-5'>嵌入式</b>最好的<b class='flag-5'>printf</b>,用起來!

    嵌入式系統(tǒng)滿足物聯(lián)網(wǎng)應用

      在許多方面,嵌入式系統(tǒng)是物聯(lián)網(wǎng)(IoT)的鼻祖 - 現(xiàn)在物聯(lián)網(wǎng)正在改變我們設計和構建軍事嵌入式系統(tǒng)的關鍵方面。事實上,物聯(lián)網(wǎng)中嵌入式
    的頭像 發(fā)表于 11-01 11:42 ?959次閱讀