国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Keil環(huán)境下CANopenNode移植到STM32問(wèn)題記錄(一)---printf重定向問(wèn)題

這篇具有很好參考價(jià)值的文章主要介紹了Keil環(huán)境下CANopenNode移植到STM32問(wèn)題記錄(一)---printf重定向問(wèn)題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


在直接將CANopenSTM32的示例工程直接移植到Keil環(huán)境下。
如果移植工程未實(shí)現(xiàn)printf函數(shù)重定向,則要注釋掉log_printf下面的printf函數(shù),使日志打印失效
/* Printf function of CanOpen app */
#define log_printf(macropar_message, ...) //printf(macropar_message, ##__VA_ARGS__)

在未在選項(xiàng)中勾選使用微庫(kù)的時(shí)候,程序會(huì)卡死。調(diào)試會(huì)發(fā)現(xiàn)是卡死在了BKAP 0xAB處,網(wǎng)上搜索會(huì)有很多說(shuō)明,是因?yàn)槭褂昧藀rintf函數(shù)而為實(shí)現(xiàn)重定向?qū)е碌?。解決辦法1:勾選上使用微庫(kù)。辦法2:禁用半主機(jī)模式。
選擇辦法1后進(jìn)行編譯,程序可以正常運(yùn)行了。

問(wèn)題描述

因?yàn)槲以谄渌こ躺鲜褂胊rm clang編譯器,因而不能選擇勾選微庫(kù)的方式。因而我嘗試辦法2,但這時(shí)就出現(xiàn)了比較奇怪的問(wèn)題(兩個(gè)編譯器都會(huì)出現(xiàn)這個(gè)奇怪的問(wèn)題,這里是在armcc編譯器下的測(cè)試)

按照我之前文章中https://blog.csdn.net/xiaoyuanwuhui/article/details/110538555描述的如下方式便可以重定向。

/* ------------------通過(guò)重定向?qū)rintf函數(shù)映射到串口1上-------------------*/
#if !defined(__MICROLIB)

#pragma import(__use_no_semihosting)
void _sys_exit(int x) //避免使用半主機(jī)模式
{
  x = x;
}
//__use_no_semihosting was requested, but _ttywrch was 
void _ttywrch(int ch)
{
    ch = ch;
}
typedef struct __FILE
{
  int handle;
}FILE;

#endif

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif 
PUTCHAR_PROTOTYPE
{
  /* 實(shí)現(xiàn)串口發(fā)送一個(gè)字節(jié)數(shù)據(jù)的函數(shù) */
  //serial_write(&serial1, (uint8_t)ch); //發(fā)送一個(gè)自己的數(shù)據(jù)到串口
	//HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
  return ch;
}

但是在添加了上述內(nèi)容后,進(jìn)行編譯提示了如下報(bào)錯(cuò):請(qǐng)求禁用半主機(jī)模式,但是_sys_open函數(shù)未定義
Keil環(huán)境下CANopenNode移植到STM32問(wèn)題記錄(一)---printf重定向問(wèn)題,CANopenNode,STM32,stm32,CANopenNode
仿照之前定義_sys_exit()函數(shù)的方式定義_sys_open()函數(shù),如下:

void _sys_open(int x)
{
  x = x;
}

然后進(jìn)行編譯程序又出現(xiàn)了如下報(bào)錯(cuò):_sys_open函數(shù)重復(fù)定義
Keil環(huán)境下CANopenNode移植到STM32問(wèn)題記錄(一)---printf重定向問(wèn)題,CANopenNode,STM32,stm32,CANopenNode
至此,一臉懵逼,到底什么情況:不定義提示缺少定義,定義了又提示重復(fù)定義,只能是無(wú)語(yǔ)了。期待有大佬可以詳細(xì)描述下這是怎么回事 ,不勝感激!

問(wèn)題結(jié)決

https://developer.arm.com/documentation/ka002219/latest文章中提供了一種半主機(jī)問(wèn)題的解決方案:使用RTE(Run-Time-Environment)中的Compiler組件重新定位標(biāo)準(zhǔn)C運(yùn)行時(shí)庫(kù)的I/O函數(shù)。
Keil環(huán)境下CANopenNode移植到STM32問(wèn)題記錄(一)---printf重定向問(wèn)題,CANopenNode,STM32,stm32,CANopenNode
這里我只針對(duì)于解決上面的問(wèn)題,如上圖所示,在STDOUT處選中,并將后面的值改為User。
將程序中之前重定向的代碼全部移除掉,然后進(jìn)行編譯,這時(shí)仍會(huì)有一個(gè)報(bào)錯(cuò)提示,如下:
Keil環(huán)境下CANopenNode移植到STM32問(wèn)題記錄(一)---printf重定向問(wèn)題,CANopenNode,STM32,stm32,CANopenNode
這是因?yàn)槲覀冞x擇了重定向輸出,還需要實(shí)現(xiàn)對(duì)應(yīng)的stdout_putchar函數(shù)(用于打印一個(gè)字符到輸出設(shè)備),一般而言這需要通過(guò)串口實(shí)現(xiàn)發(fā)送一個(gè)字符的功能,這里暫時(shí)先定義一個(gè)空函數(shù):

int stdout_putchar (int ch) {

}

然后再進(jìn)行編譯,結(jié)果如下:
Keil環(huán)境下CANopenNode移植到STM32問(wèn)題記錄(一)---printf重定向問(wèn)題,CANopenNode,STM32,stm32,CANopenNode
此時(shí)已經(jīng)沒(méi)有報(bào)錯(cuò)了,程序下載到單片機(jī)上也可以正常運(yùn)行了。

思考:

為什么這種方式可以解決問(wèn)題,之前的方式就不可以呢?
這里我們將RTE下的retarget_io.c文件中的內(nèi)容復(fù)制一份到retarget.c文件,并添加到工程中,然后將之前勾選的RTE中的STDOUT的取消,在retarget.c文件的前面添加上如下宏定義并注釋掉RTE組件頭文件

//#include "RTE_Components.h"
#define RTE_Compiler_IO_STDOUT_User
#define RTE_Compiler_IO_STDOUT

直接進(jìn)行編譯,也沒(méi)有出現(xiàn)報(bào)錯(cuò),下載到單片機(jī)中也可以正常運(yùn)行。

__attribute__((weak))
FILEHANDLE _sys_open (const char *name, int openmode) {};
__attribute__((weak))
int _sys_close (FILEHANDLE fh) {};
__attribute__((weak))
int _sys_write (FILEHANDLE fh, const uint8_t *buf, uint32_t len, int mode) {};
__attribute__((weak))
int _sys_istty (FILEHANDLE fh) {};
__attribute__((weak))
int _sys_seek (FILEHANDLE fh, long pos) {};
__attribute__((weak))
long _sys_flen (FILEHANDLE fh) {};

上面這6個(gè)函數(shù)注釋掉哪一個(gè)都會(huì)出現(xiàn)如下報(bào)錯(cuò):
Keil環(huán)境下CANopenNode移植到STM32問(wèn)題記錄(一)---printf重定向問(wèn)題,CANopenNode,STM32,stm32,CANopenNode
好像是要將所有的這幾個(gè)函數(shù)都實(shí)現(xiàn)了才不會(huì)調(diào)用C庫(kù)中的函數(shù)。
進(jìn)一步實(shí)驗(yàn):
將上面的6個(gè)函數(shù)的空語(yǔ)句添加到main.c的空白位置,然后進(jìn)行編譯,發(fā)現(xiàn)不會(huì)報(bào)錯(cuò),但程序下載到單片機(jī)內(nèi)依然會(huì)卡死。
再在6個(gè)函數(shù)的前面添加上__stdin_name,__stdout_name,__stderr_name的定義

#include <rt_sys.h>
///* Standard IO device name defines. */
const char __stdin_name[]  = ":STDIN";
const char __stdout_name[] = ":STDOUT";
const char __stderr_name[] = ":STDERR";
__attribute__((weak))
FILEHANDLE _sys_open (const char *name, int openmode) {};
__attribute__((weak))
int _sys_close (FILEHANDLE fh) {};
__attribute__((weak))
int _sys_write (FILEHANDLE fh, const uint8_t *buf, uint32_t len, int mode) {};
__attribute__((weak))
int _sys_istty (FILEHANDLE fh) {};
__attribute__((weak))
int _sys_seek (FILEHANDLE fh, long pos) {};
__attribute__((weak))
long _sys_flen (FILEHANDLE fh) {};

然后再進(jìn)行編譯也不會(huì)報(bào)錯(cuò),下載到單片機(jī)內(nèi)也可以正常運(yùn)行。
初步結(jié)論:只有6個(gè)函數(shù)和3個(gè)變量都定義了才能完成完整的重定向功能。
實(shí)際應(yīng)用時(shí)還是建議直接使用RTE的組件,這里拆分出來(lái)是為了進(jìn)一步分析。

相關(guān)文章

std::mt19937 with ARM Compiler 6 uses sys_open and breaks retarget.c
I/O Retargeting文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-534783.html

到了這里,關(guān)于Keil環(huán)境下CANopenNode移植到STM32問(wèn)題記錄(一)---printf重定向問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【STM32】Keil V5聯(lián)合VSCode配置代碼編寫(xiě)與下載環(huán)境,解決報(bào)錯(cuò)問(wèn)題

    【STM32】Keil V5聯(lián)合VSCode配置代碼編寫(xiě)與下載環(huán)境,解決報(bào)錯(cuò)問(wèn)題

    最近重新?lián)炱鹆薙TM32的開(kāi)發(fā)工作,由于之前一年多的時(shí)間一直在從事PC端與Linux下的開(kāi)發(fā),習(xí)慣了VSCode的開(kāi)發(fā)界面以及各種方便的插件,再次打開(kāi)keil的界面時(shí)倍感丑陋。于是花了不少心思配置了VSCode中的代碼編寫(xiě)環(huán)境,再次特做記錄。 VSCode的插件商店中其實(shí)包含了支持Keil的插

    2024年02月06日
    瀏覽(89)
  • MPU6050(讀取原數(shù)據(jù)、移植DMP、stm32f4、HAL庫(kù)、KEIL5)

    MPU6050(讀取原數(shù)據(jù)、移植DMP、stm32f4、HAL庫(kù)、KEIL5)

    記錄一下自己遇到的問(wèn)題及解決方法,希望能幫助到一些人。 第一步,讀取芯片的原始數(shù)據(jù)。需要注意兩點(diǎn):1、對(duì)HAL庫(kù)提供的IIC讀取寫(xiě)入函數(shù)進(jìn)行再包裝。(千萬(wàn)不要覺(jué)的這步多此一舉,后面移植DMP時(shí)用得到) 2、芯片的地址(這里面有倆坑)第一就是,芯片的 I2C 設(shè)備地址

    2023年04月08日
    瀏覽(28)
  • STM32F7xx Keil5 RTX RL-TCPnet DP83822移植

    STM32F7xx Keil5 RTX RL-TCPnet DP83822移植

    暫時(shí)全部默認(rèn)配置,DHCP已打開(kāi) 修改RTE_Device.h ETH配置 修改DP83822驅(qū)動(dòng) 去掉文件只讀屬性,之后需要修改,添加到工程 修改DP83822 ID RTE創(chuàng)建tcp server例程,參考該例程,進(jìn)行修改 修改后的TCP_Socket_server.c ping Tcp client 可以PING通,但client無(wú)法連接,后來(lái)發(fā)現(xiàn)是netInitialize以及server相關(guān)

    2024年02月08日
    瀏覽(23)
  • STM32使用串口printf亂碼問(wèn)題解決方法

    STM32使用串口printf亂碼問(wèn)題解決方法

    使用stm32系列單片機(jī)串口打印問(wèn)題,在使用HAL庫(kù)重新定義printf為串口輸出后,輸出的內(nèi)容全都是亂碼,試了網(wǎng)上的方法后還是亂碼。 ?像這樣的 ? ?最后發(fā)現(xiàn)是串口調(diào)試助手和keil的文字編碼方式不同, keil中是GB 2312,串口調(diào)試助手是UFT_8,所以打印出來(lái)才會(huì)亂碼 ?將串口調(diào)試助

    2024年02月11日
    瀏覽(34)
  • STM32H5移植zbar記錄

    STM32H5移植zbar記錄

    ZBar是一種流行的二維碼掃描和解碼工具,它在嵌入式系統(tǒng)中擁有廣泛的應(yīng)用。在嵌入式系統(tǒng)中,我們面臨著有限的資源和更嚴(yán)格的性能要求,因此,選擇適當(dāng)?shù)膸?kù)來(lái)完成特定的任務(wù)非常重要。 ZBar適用于各種嵌入式平臺(tái),包括ARM、x86和MIPS等處理器架構(gòu)。它可以輕松地整合到各

    2024年02月06日
    瀏覽(48)
  • 關(guān)于STM32F4系列中printf重定向問(wèn)題詳解

    關(guān)于STM32F4系列中printf重定向問(wèn)題詳解

    前言 關(guān)于 printf函數(shù) 和 fputc函數(shù) 聯(lián)系和區(qū)別 聯(lián)系: 1.共同目標(biāo): printf 函數(shù)和 fputc 函數(shù)都用于將字符 輸出到指定的輸出流中 。 2.字符輸出: 兩個(gè)函數(shù)都可以用于輸出一個(gè)字符,但在實(shí)際使用時(shí), printf 函數(shù) 通常用于輸出 格式化的數(shù)據(jù) ,而 fputc 函數(shù) 更常用于 單個(gè)字符的直

    2024年02月03日
    瀏覽(23)
  • Keil5編譯環(huán)境搭建流程----STM32和GD32

    以下藍(lán)色字體是對(duì)應(yīng)文章的鏈接,單擊便可以查看詳細(xì)信息! 文章鏈接: Keil5-MDK下載和安裝教程 資源鏈接: Keil5_MDK安裝包鏈接----點(diǎn)擊下載 文章鏈接: stm32芯片包下載和安裝教程 GD32芯片包下載和安裝教程 資源鏈接: Keil5-STM32芯片包鏈接----點(diǎn)擊下載 Keil5-GD32芯片包鏈接---

    2024年02月05日
    瀏覽(49)
  • 【正點(diǎn)原子STM32探索者】CubeMX+Keil開(kāi)發(fā)環(huán)境搭建

    【正點(diǎn)原子STM32探索者】CubeMX+Keil開(kāi)發(fā)環(huán)境搭建

    本文主要分為三部分,第一部分介紹正點(diǎn)原子STM32探索者開(kāi)發(fā)板外觀和配套資料如何下載,第二部分介紹如何搭建CubeMX+Keil開(kāi)發(fā)環(huán)境,第三部分介紹如何使用CubeMX和Keil一步步創(chuàng)建出一個(gè)點(diǎn)亮LED燈的項(xiàng)目。搭建開(kāi)發(fā)環(huán)境部分,包括安裝Keil MDK、安裝STM32 CubeMX、安裝STM32F4系列MCU的

    2024年03月16日
    瀏覽(29)
  • 【32】STM32F103在Keil4軟件下開(kāi)發(fā)環(huán)境的建立

    【32】STM32F103在Keil4軟件下開(kāi)發(fā)環(huán)境的建立

    目錄 一、下載STM32F10x 固件庫(kù)下載 二、對(duì)所需的庫(kù)文件分類(lèi)存放 三、配置Keil4開(kāi)發(fā)環(huán)境 STM32 固件庫(kù) STM32 Standard Peripheral Libraries,適用于STM32F1系列 STM32 的固件庫(kù)是芯片官方給出的用于新建STM32工程與相關(guān)的庫(kù)文件,示例程序的文件包。 STM32F103的固件庫(kù)可以去STM官網(wǎng)下載 https

    2024年02月04日
    瀏覽(22)
  • Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記)

    Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記)

    ICP ICP(In Circuit Programing)。在電路編程,可通過(guò) CPU 的 Debug Access Port 燒錄代碼,比如 ARM Cortex 的 Debug Interface 主要是 SWD(Serial Wire Debug) 或 JTAG(Joint Test Action Group); ISP ISP(In System Programing)。在系統(tǒng)編程,可借助 MCU 廠商預(yù)置的 Bootloader 實(shí)現(xiàn)通過(guò)板載 UART 或 USB 接口燒錄代碼,比如

    2024年02月06日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包