最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

教程示例:嵌入式軟件移植 printf

2023-06-15 16:59 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

在嵌入式中printf 這種功能強(qiáng)大的函數(shù)可謂是c語言庫函數(shù)的中的一股清流!也就是太好用了吧!今天分享的例程有 stm32f4ZG 和 cc2530f256,這個兩款芯片的移植例程和移植教程!相信你看完后也可以移植到別的芯片去!

  • 使用的keil版本為:5.21a

  • IAR for 8051 version 為 10.10.1

可能會因為有些版本不同配置就略有所不同?。╢4)串口1:

(f4)串口2:

下面這個是TI 的cc2530(就先跑著寄存器版本的吧,協(xié)議棧里頭配置差不太多!):

為啥要移植呢!相信學(xué)過實時操作系統(tǒng)的都有所了解,有個叫互斥信號量的東西!就是為了防止同一時間內(nèi)有兩個寄存器(那十來個寄存器,不是指外設(shè)!)在訪問同一塊內(nèi)存!這個很嚴(yán)重的,可能會導(dǎo)致程序死機(jī),或者卡在了某個死循環(huán)里面!

我們所使用的 printf 就是首先通過 vsprinf 對我們傳進(jìn)來的參數(shù)進(jìn)行格式化,我們傳進(jìn)去多少數(shù)據(jù),他按照我們傳進(jìn)來的格式,格式化后統(tǒng)統(tǒng)存放在一個buf里,如果我們定義了重定向,它就會把這個buf發(fā)送至你要發(fā)送的地方!

想象一下,如果在某個系統(tǒng)中有一個線程在vsprintf里面運(yùn)行,突然有一個任務(wù)級別比他高的任務(wù)把它運(yùn)行的時間搶了過去!而任務(wù)優(yōu)先級高的任務(wù)也在printf里面使用了那個buf,那就會產(chǎn)生上述的問題!

那就意味著我們所使用的 printf 存在不安全問題!當(dāng)然我們在系統(tǒng)中可以通過臨界保護(hù)區(qū)來處理,也可以通過信號量等等處理!

但是目前有一個線程安全的函數(shù),擺在你面前,就問你用不用?

那我們的上邊 printf_u1 它是怎么處理的呢?毫無疑問,看代碼就能知道,它是直接發(fā)送的,也就是說你傳進(jìn)來的每一個參數(shù)它都會順手就發(fā)送出去(當(dāng)然要看你配置),它的數(shù)據(jù)將不會存放在一個 buf 里邊,在發(fā)送。這就是他給力的地方了!


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ??



keil移植printf

首先,我們到文章的末尾獲取到源代碼后,打開 keil 軟件, 點擊?project > Options for…?就能打開一下頁面:

點擊 C/C++,選擇c99標(biāo)準(zhǔn)。到此為止編譯器配置完畢!

下面來配置代碼部分,打開頭文件為printf.h:

1,添加這個兩個文件的路徑還有頭文件,如果不懂可以搜搜!2,點擊圖片上面的printf_ 去它定義的地方,我們要做出一定的修改。

來到這里之后我們可以看到_vsprintf 這個代碼里面最復(fù)雜的就是這一串函數(shù)了!

我們只要修改這_putchar 里面的內(nèi)容即可。參數(shù)二是我加上去的為了區(qū)分不同的串口類型,有多少個串口就的寫多少個_out_char 這樣的函數(shù)(這個是我的方法):

上圖是串口1的。再來看看串口2的:

而_putchar 就是我們數(shù)據(jù)最終流向的地方了!我是這樣寫的。

這個?USART3->DR 為stm32串口的寄存器!讀者可參照自己的芯片來配置!

簡單就完了!

IAR 配置方法

首先添加文件:

我在這里起名字為 C_Library。然后在添加文件:

選擇 printf.c (反正就是添加這個文件,放到哪里看你自己):

接著就是添加編譯器頭文件路徑:

在選擇第一個大框框右邊的那個:

點擊Click to add。選擇頭文件路徑所在的文件夾后 select,接著就會回到這里:

上面是配置頭文件路徑的,第一個是絕對路徑,也就是說你工程文件移動了,就回到不到了,第二個是相對路徑!選第二個吧!接著編譯就會發(fā)現(xiàn)報錯了?。?!不要慌!我們首先選擇Options > General Options:

此時在編譯一次,就會發(fā)現(xiàn)也還是錯了!說什么沒定義。經(jīng)研究,哦,原來是stdint.h這個頭文件在for 8051 這款工具上,沒有定義64為的無符號整形,那個怎么辦??!經(jīng)發(fā)現(xiàn),哦 ,原來注釋這個宏就行!

程序編譯通過!printf_u0 和stm32 配置類型,無非就是修改一下數(shù)據(jù)的流向!讀者自己研究一下吧??!

原文作者:【一起學(xué)嵌入式?】


教程示例:嵌入式軟件移植 printf的評論 (共 條)

分享到微博請遵守國家法律
安远县| 黄石市| 伊宁县| 齐河县| 上饶县| 西华县| 阜南县| 桦甸市| 博乐市| 合江县| 天台县| 靖安县| 五家渠市| 文山县| 宜城市| 朝阳县| 蒲江县| 彰武县| 新乡县| 绥德县| 鞍山市| 嘉鱼县| 都匀市| 威宁| 汉川市| 晋州市| 温州市| 泰宁县| 漯河市| 揭阳市| 张家界市| 林周县| 伽师县| 巴楚县| 桐梓县| 平利县| 马龙县| 赤水市| 莒南县| 莲花县| 沂水县|