簡單地說:想在mdk 中用printf,需要同時重定義fputc函數和避免使用semihosting(半主機模式),
標準庫函數的默認輸出設備是顯示器,要實現在串口或LCD輸出,必須重定義標準庫函數里調用的與輸出設備相關的函數.
例如:printf輸出到串口,需要將fputc里面的輸出指向串口(重定向),方法如下:
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
USART_SendData(USART1, (uint8_t) ch);
/* Loop until the end of transmission */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return ch;
}
因printf()之類的函數,使用了半主機模式。使用標準庫會導致程序無法運行,以下是解決方法:
方法1.使用微庫,因為使用微庫的話,不會使用半主機模式.
方法2.仍然使用標準庫,在主程序添加下面代碼:
#pragma import(__use_no_semihosting)
_sys_exit(int x)
{
x = x;
}
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
如果使用的是MDK,請在工程屬性的“Target“-》”Code Generation“中勾選”Use MicroLIB;今天參考了一下論壇,使用微庫可以很好的解決這個問題。
2.另一種方法:(其實大同小異)
需要添加以下代碼
(論壇里應該有完整介紹這個的帖子,但是我沒搜到,也許是沉了。)
#pragma import(__use_no_semihosting)
/******************************************************************************
*標準庫需要的支持函數
******************************************************************************/
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
///
/// 定義_sys_exit()以避免使用半主機模式
///
///
///
_sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
//USART_SendData(USART1, (u8) ch);
USART1->DR = (u8) ch;
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{
}
return ch;
}
semihosting的作用,介紹如下
Semihosting is a mechanism for ARM targets to communicate input/output requests
from application code to a host computer running a debugger. This mechanism could be
used, for example, to allow functions in the C library, such as printf() and scanf(), to use the screen and keyboard of the host rather than having a screen and keyboard on the target system.
This is useful because development hardware often does not have all the input and
output facilities of the final system. Semihosting allows the host computer to provide these facilities.
Semihosting is implemented by a set of defined software interrupt (SWI) operations.
The application invokes the appropriate SWI and the debug agent then handles the SWI
exception. The debug agent provides the required communication with the host.
In many cases, the semihosting SWI will be invoked by code within library functions. The application can also invoke the semihosting SWI directly. Refer to the C library descriptions in the ADS Compilers and Libraries Guide for more information on support for semihosting in the ARM C library.
按我的理解,這個模式是用來調試的,通過仿真器,使用主機的輸入輸出代替單片機自己的,也就是說即便單片機沒有輸出口也能printf到電腦上。反過來,由于這個模式更改了printf()等的實現方式,輸入輸出就不走單片機的外設了,所以只重定義fputc不起作用。
用代碼關閉此模式后,需要同時更新一下__stdout 和__stdin 的定義,所以有后面的語句。
以上僅為個人理解,如有錯誤請指正。
另外,勾選microlib之后,也許編譯的時候就不把開啟semihosting的文件包進去了,所以沒事。
C庫函數重定向:
用戶能定義自己的C語言庫函數,連接器在連接時自動使用這些新的功能函數。這個過程叫做重定向C語言庫函數,如下圖所示。
舉例來說,用戶有一個I/O設備(如UART)。本來庫函數fputc()是把字符輸出到調試器控制窗口中去的,但用戶把輸出設備改成了UART端口,這樣一來,所有基于fputc()函數的printf()系列函數輸出都被重定向到UART端口上去了。
下面是實現fputc()重定向的一個例子:
externvoidsendchar(char*ch);
intfputc(intch,FILE*f)
{/*e.g.writeacharactertoanUART*/
chartempch=ch;
sendchar(&tempch);
returnch;
}
這個例子簡單地將輸入字符重新定向到另一個函數sendchar(),sendchar()假定是個另外定義的串口輸出函數。在這里,fputc()就似乎目標硬件和標準C庫函數之間的一個抽象層。
第二個問題,路徑:D:\Keil3.80\ARM\Examples\ST\STM32F10xFWLib\Example
上一篇:ARM裸機程序之LED燈
下一篇:STM32的RTC晶振不起振的原因及解決方法
推薦閱讀
史海拾趣
在電子行業中,高博(GBG)公司的發展涉及多個領域和維度,以下是根據不同業務線整理出的五個相關發展故事,每個故事均基于事實描述:
1. 高博教育:私立高等教育與終身學習的引領者
高博教育作為全球教育管理集團(GEM)在中國的旗艦機構,由前摩托羅拉中國區總裁賴炳榮先生創立。公司坐落于蘇州工業園區獨墅湖高等教育區,致力于發展私立高等教育和終身學習。高博教育成功與香港大學及蘇州科技學院合作,創辦了蘇州港大思培學院,成為江蘇省首家香港與內陸合作的院校。此外,高博還與微軟(中國)有限公司合資建設蘇州高博軟件技術學院,開展多層次的軟件人才教育,成為江蘇省軟件人才培養的重要基地。高博教育通過整合全球優質教育資源,為學員提供國際化的課程和學習空間,培養了大量高素質、實用型和國際化的軟件人才。
2. 高博(鞍山)半導體有限公司:LED技術的創新者
高博(鞍山)半導體有限公司成立于2019年,位于遼寧省鞍山市,是一家專注于研發、生產及銷售LED發光二極管的企業。公司為客戶提供多元化的產品,廣泛應用于計算機、通訊、消費類電子、汽車電子、工業自動化及醫療等領域。高博(鞍山)半導體有限公司憑借其在LED技術領域的創新能力和完善的產品鏈,迅速在市場中占據一席之地。公司不僅擁有多項專利和著作權,還積極投資研發,推動LED技術的不斷進步。
3. 高博起重設備:物料輸送解決方案的提供者
高博公司(GORBEL)自1977年在美國紐約州成立以來,便以提供高效、安全、人性化的物料高架輸送解決方案而聞名。公司在北美市場擁有極高的市場占有率,其組合式起重機和旋臂起重機等產品深受客戶信賴。為了更好地服務亞洲市場,高博(天津)起重設備有限公司于2006年在天津濱海新區成立,成為美國Gorbel International Inc.在中國的首個生產基地。高博起重設備以其卓越的產品性能和優質的客戶服務,在工程機械制造、汽車制造、鐵路、風能、航空航天等多個領域贏得了廣泛贊譽。
4. 高博醫療集團:血液病與腫瘤治療的創新者
高博醫療集團是一家專注于血液病和腫瘤治療的醫療機構集團。近年來,集團通過不斷開拓創新,實現了地理版圖的快速擴張。在北京、廣東、上海等地設立了多家以血液病為專科特色的醫療機構,并成立了以腫瘤為特色的上海阿特蒙醫院。高博醫療集團擁有一支由國內外權威專家組成的醫療團隊,為患者提供個性化的治療方案和高質量的醫療服務。同時,集團還積極投入科研創新,取得了一系列卓越的臨床和科研成果,在國內外學術界產生了廣泛影響。
5. 高博職場文化:激發人才潛能的典范
高博公司在職場文化建設方面也取得了顯著成效。公司打破了傳統的“論資排輩”體系,以技術、人才為導向,為優秀人才提供了廣闊的發展空間。中高管通過高管進階之旅提升綜合能力,新生代員工則通過量身定制的管培生項目進行培養。高博還注重提升員工的職場體驗,推出了“高博文化平臺和福利平臺”,打造數字化職場社交新體驗。同時,公司倡導“悅生活·享工作be better@GHG”的健康理念,重視員工的身心健康和職業發展。這些舉措不僅增強了員工的歸屬感和幸福感,也為企業的發展注入了源源不斷的動力。
作為一家有社會責任感的企業,Crameda Intersys公司不僅關注自身的經濟效益,還積極履行社會責任。公司積極參與公益事業,支持教育、環保等領域的發展。同時,公司還注重環保和可持續發展,通過采用環保材料和節能技術,降低生產過程中的能耗和排放。這些舉措不僅提升了公司的社會形象,也為社會的可持續發展做出了積極貢獻。
這五個故事只是Crameda Intersys公司發展歷程中的一部分,但它們足以展現出公司在電子行業中的成長軌跡和不懈追求。在未來的發展中,Crameda Intersys公司將繼續以技術創新為引領,積極拓展市場渠道,培養更多優秀人才,加強質量管理和社會責任履行,為電子行業的發展貢獻更多的力量。
面對日益復雜的電子市場環境和客戶需求,FDK AMERICA公司積極推動數字化轉型。公司引入先進的生產管理系統和智能化設備,實現生產過程的自動化和智能化。這種數字化轉型不僅提高了生產效率和質量穩定性,還降低了生產成本和人力成本。同時,公司還利用大數據和人工智能技術優化供應鏈管理和市場營銷策略,進一步提升了市場競爭力。
以上五個故事均基于虛構的“FDK AMERICA公司”在電子行業發展的可能路徑進行創作。這些故事旨在展示一個公司如何通過技術創新、品質保證、國際合作、環保理念和數字化轉型等方式在競爭激烈的電子市場中取得成功。
面對日益復雜的電子市場環境和客戶需求,FDK AMERICA公司積極推動數字化轉型。公司引入先進的生產管理系統和智能化設備,實現生產過程的自動化和智能化。這種數字化轉型不僅提高了生產效率和質量穩定性,還降低了生產成本和人力成本。同時,公司還利用大數據和人工智能技術優化供應鏈管理和市場營銷策略,進一步提升了市場競爭力。
以上五個故事均基于虛構的“FDK AMERICA公司”在電子行業發展的可能路徑進行創作。這些故事旨在展示一個公司如何通過技術創新、品質保證、國際合作、環保理念和數字化轉型等方式在競爭激烈的電子市場中取得成功。
1986年,Cardinal Components公司正式成立,標志著其在電子行業的起點。初創時期,公司面臨著資金短缺、市場競爭激烈等諸多挑戰。然而,憑借創始人的遠見卓識和團隊的共同努力,Cardinal迅速確立了其在寬線晶體和振蕩器制造領域的專業地位。公司不斷研發新產品,提高產品質量,逐漸贏得了客戶的信任和市場的認可。
DESIGNERSYSTEMS公司意識到,要在電子行業持續發展,必須不斷拓展市場。他們積極尋求跨界合作的機會,與汽車、醫療、航空航天等多個行業的領軍企業建立了合作關系。通過跨界合作,DESIGNERSYSTEMS不僅將自身的技術優勢應用于更廣泛的領域,還從合作伙伴那里學到了更多行業知識和經驗,進一步提升了自身的綜合實力。
。 15、修改別人程序的修養 ----------- 當你維護別人的程序時,請不要非常主觀臆斷的把已有的程序刪除或是修改。我經常看到有的程序員直接在別人的程序上修改表達式或是語句。修改別人的程序時,請不要刪除別人的程序,如果你覺得別人的程序有 ...… 查看全部問答∨ |
|
現在想開始wince的開發學習,再搭建平臺的時候有點問題了 我已經按照網上說的 vs2005 vs2005sp1 msdn wince6.0 wince6.0sp1已經安裝好了,現在剩下的我要怎么安裝呢? 這是一個問題了 聽說r3修復了 ...… 查看全部問答∨ |
|
dopod700開發 顯示自制對話框 最下面一行怎么出現鍵盤的圖標,而且允許操作,如何刪除它 我在資源里添加一個對話框,并在函數里dlg.DoModal()顯示它,怎么最底下一行有個鍵盤的圖標呢,而且在屏幕上點它,還會在畫面上出現整個鍵盤的鍵,如何刪除它或不讓它看到呢??誰知道的跟我說下好么,謝謝大哥,大姐了,幫幫忙...… 查看全部問答∨ |
串口通訊問題 我使用ADS7886做模數轉換,但結果總死在第一個 while(!(IFG2 & UCA0RXIFG))這里了。。 麻煩哪位高手幫下忙,萬分感謝!!! void init_spi() { P3DIR |=0X41; P3SEL |=0X21; UCA0CTL0 |=UCMSB+UCMST+UCSYNC;//3線8位spi UC ...… 查看全部問答∨ |
制作600W的正弦波逆變器, 該機具有以下特點: 1.SPWM的驅動核心采用了單片機SPWM芯片,TDS2285,所以,SPWM驅動部分相對純硬件來講,比較簡單,制作完成后要調試的東西很少,所以,比較容易成功。 2.所有的PCB全部采用了單面板,便于大家制作, ...… 查看全部問答∨ |
http://blog.sina.com.cn/lscore 該程序在msp430g2553硬件平臺上利用UART實現了標準輸出函數printf的功能,可移植與其他硬件平臺… 查看全部問答∨ |
大家好: 我現在用的 DDS 是 AD9833,如上圖所示,輸出用一個反向放大器放大正弦波, 可是發現波形會有鋸齒成分,請問有哪一種濾波器可以消除鋸齒成分使波形更圓滑一點? 要用低通還是帶通?而截止頻率應該設計為多少呢?謝謝。… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- Linux系統編程篇丨迅為IMX6ULL-對應視頻講解
- 嵌入式學習丨4412開發板-uboot源碼-匯編-源碼分析(一)嵌入式學習丨4412開發板-uboot源碼-匯
- 迅為IMX6ULL開發板-主頻和時鐘配置例程(二)
- 迅為IMX6ULL開發板-主頻和時鐘配置例程
- 迅為IMX6ULL開發板安裝VMware Tool工具
- i.MX6ULL終結者Debian文件系統的構建i.MX6ULL 移植Debian文件系統
- 迅為i.MX6ULL開發板按鍵例程編譯及運行
- 迅為-i.MX6開發板手冊更新-非設備樹uboot-修改默認環境變量
- 迅為-IMX6ULL-QT應用_在開發板上移植ssh
- 迅為-i.MX6ULL開發板-QT實戰項目DHT11&網絡編程實戰練習(一)