• _sys_exit()函数的以及semihosting半主机模式的说明


    _sys_exit()函数的以及semihosting半主机模式的说明

    semihosting半主机模式说明

    1. Semihosted环境(semihosting是针对ARM目标机的一种机制,它能够根据应用程序代码的输入/输出请求,与运行有调试功能的主机通讯。这种技术允许主机为通常没有输入和输出功能的目标硬件提供主机资源)在semlhosted环境下用来实现C库函数与目标相关的函数。

    2. 简单的说,就是我们嵌入式程序中,类似printf的接口是会与我们PC进行通讯,以方便我们借助我们调试板的仿真器在PC上用开发工具进行调试。

    为什么要禁用半主机模式?

    在嵌入式的编程中你是避免不了使用printf、fopen、fclose等函数的但是因为嵌入式的程序中并没有对这些函数的底层实现,使得设备运行时会进入软件中断BAEB处,这时就需要__use_no_semihosting_swi这 个声明,使程序遇到这些文件操作函数时不停在此中断处。

    MDK上开启半主机模式-需要SWO线(换言之,需要使用JTAG接线),而我们程序模式开启的半主机模式(此时没有SWO线),所以,我们需要禁止半主机模式。当目标板脱离仿真器(jlink/ulink)单独运行时,不能使用半主机模式。否则进入软件中断BAEB处,无法再执行下去.

    如何禁止半主机模式?

    __arm(".global__use_no_semihosting\n\t")
    这条语句可以关闭半主机模式,只需要在任意一个C文件中加入即可。
    
    • 1
    • 2

    还有在使用keil编程的过程中还会遇到…\OBJ\USART.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _ttywrch was referenced
    说的大概的意思就是关掉了半主机模式,但是函数__ttywrch被要求了,这时要把函数重写一遍,当然出现其他的函数被要求的时候,可以参考上面的函数进行编写,只要放到任意一个.c源文件之中即可。

    
    __arm(".global__use_no_semihosting\n\t")
    //解决HAL库使用时,某些情况可能报错的bug
    //因为禁止了半主机模式,需要重写一个半主机模式下的接口,如下
    int _ttywrch(int ch)    
    {
        ch=ch;
    	return ch;
    }
     
    //定义_sys_exit()以避免使用半主机模式    
    void _sys_exit(int x) 
    { 
    	x = x; 
    } 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    原文链接:https://blog.csdn.net/qq_34810707/article/details/112255306

  • 相关阅读:
    MATLAB--二维图像和三维图像的绘制
    SQLyog 连接 MySQL8.0+ 报错2058
    Educational Codeforces Round 154 (Rated for Div. 2)【A-E】【详细题解,F未完待续】
    Flutter循序渐进==>数据结构(列表、映射和集合)和错误处理
    实现艾尔登法环中的大卢恩效果
    编译报错:Manifest merge failed : Attribute application@appComponentFactory
    mysql UUID 作为主键的问题
    函数指针解释
    NIO‘s Sword(思维,取模,推公式)
    ruoyi-vue(若依前后端分离版本)环境搭建 用eclipse 安装redis 后端配置 配置node环境 前端配置
  • 原文地址:https://blog.csdn.net/Haomione/article/details/126483439