MDK編譯出現__use_no_semihosting was requested, but _ttywrch was referenced

.\Output\Q-SYS.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _ttywrch was referenced

解決的代碼如下: 
//不使用半主機模式
#if 1 //如果沒有這段,則需要在target選項中選擇使用USE microLIB
#pragma import(__use_no_semihosting)    //註釋本行, 方法1
struct __FILE {
int handle;
};
FILE __stdout;

_sys_exit(int x)
{
x = x;
}

//__use_no_semihosting was requested, but _ttywrch was referenced, 增加如下函數, 方法2
_ttywrch(int ch)
{
ch = ch;
}
#endif

參考: http://www.openedv.com/posts/list/12417.htm


--- L6220E: Execution region RW_IRAM size (155360 bytes) exceeds limit (98304 bytes).
出現上面的錯誤後, 查看 .map文件, 檢查相關的RW項, 發現如下:
    Symbol Name                              Value     Ov Type        Size  Object(Section)
Memory Map of the image
Base Addr    Size         Type   Attr      Idx    E Section Name        Object
0x20000044   0x00025800   Zero   RW          390    .bss                lcd9320.o

再查找lcd9320, 發現如下, LCD_BUF定義的太大.
.bss                                     0x20000044   Section    153600  lcd9320.o(.bss)
LCD_BUF                                  0x20000044   Data       153600  lcd9320.o(.bss)

--- lpc9320.c 中有如下定義:
unsigned short LCD_BUF[LCD_YSIZE][LCD_XSIZE]; //原因找到!!!!

//---- 定義大容量內存數據.
#define dfBufLen 0x100000
//必須定義爲全局變量後纔可以放於SDRAM中(在map中可找到); 若爲local則Error, 在map中無法找到對應段.
unsigned char g_ucBuf[dfBufLen];

void MyBufTest(void)
{
//unsigned char ucBuf[dfBufLen]; //Error
g_ucBuf[dfBufLen - 2] = 0x01;
g_ucBuf[dfBufLen - 1] = 0x02;
DEBUG_PRINT("main-->Buf = 0x%04x, 0x%04x\n", g_ucBuf[dfBufLen - 2], g_ucBuf[dfBufLen - 1]);
}
Error: L6406E: No space in execution regions with .ANY selector matching f24_ascii.o(.constdata).
//MCU類型選擇錯誤: STM32F103VE, 錯誤的選擇 STM32F103CB

程序跳進了硬件錯誤中斷服務程序,也就是void HardFault_Handler(void),讀取向量錯誤。
你可以查看一下異常的寄存器,先確定是精確的總線fault還是不精確的總線fault,如果是精確的fault那最可能的就是數組越界,
或是變量訪問越界,如果是不精確總線fault,那比較多出現的是堆棧的問題。 出現最多的如變量訪問越界

HardFault_Handler 的調試 最簡單的辦法:
在進入HardFault_Handler之後,根據堆棧指針查看堆棧,找到堆棧中最新的函數返回地址,到這個地址上去加斷點,
一步步根據彙編執行代碼。很快就能找到出錯原因,大多數是數組溢出,或者是指針初始化的問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章