当前位置: 首页 > wzjs >正文

衡阳网站制作公司seo友情链接

衡阳网站制作公司,seo友情链接,阜城网站建设价格,想象力做网站在 ARM 编译器(如 Keil MDK) 中禁用半主机(Semihosting)并实现标准库的基本功能,需要以下步骤: 1. 禁用半主机 #pragma import(__use_no_semihosting) // 禁用半主机模式作用:防止标准库函数&…

ARM 编译器(如 Keil MDK) 中禁用半主机(Semihosting)并实现标准库的基本功能,需要以下步骤:


1. 禁用半主机

#pragma import(__use_no_semihosting)  // 禁用半主机模式
  • 作用:防止标准库函数(如 printfscanf)依赖调试器进行 I/O 操作。
  • 后果:必须手动实现底层函数(如 _sys_exitfputc),否则会链接失败。

2. 定义简化 FILE 结构体

struct __FILE {int handle;  // 占位符,无实际用途(可简化)
};
FILE __stdout, __stdin;  // 标准输入/输出流
  • 说明
    • 标准库需要 FILE 结构体,但禁用半主机后无需复杂实现,仅需满足编译要求。
    • 如果不需要文件操作,可直接定义为空结构体:
      struct __FILE { int dummy; };
      

3. 必须实现的系统函数

(1) 程序退出处理 _sys_exit
#include "stm32f10x.h"  // 假设使用 STM32void _sys_exit(int x) {// NVIC_SystemReset();  // 硬件复位(推荐)// 或 while(1);      // 简单死循环
}
  • 作用:覆盖库的默认退出函数,避免链接错误。
  • 注意
    • 如果调用 exit() 或程序结束,会执行此函数。
(2) 输出重定向 fputc(支持 printf
int fputc(int ch, FILE *f) {USART_SendData(USART1, (uint8_t)ch);  // 发送到 USART1while (!USART_GetFlagStatus(USART1, USART_FLAG_TXE));  // 等待发送完成return ch;
}
  • 关键点
    • printf 依赖此函数输出字符。
    • 需提前初始化 USART(波特率、引脚等)。
(3) 输入重定向 fgetc(支持 scanf
int fgetc(FILE *f) {while (!USART_GetFlagStatus(USART1, USART_FLAG_RXNE));  // 等待接收数据return (int)USART_ReceiveData(USART1);
}
  • 关键点
    • scanf 依赖此函数读取字符。
    • 检查 USART_FLAG_RXNE(接收标志),而非 TC(发送完成)。

4. 完整示例代码

#pragma import(__use_no_semihosting)#include <stdio.h>
#include "stm32f10x.h"  // STM32 头文件// 简化 FILE 结构体
struct __FILE { int dummy; };
FILE __stdout, __stdin;// 系统函数
void _sys_exit(int x) { NVIC_SystemReset(); //也可以为空 }// 输出重定向(printf)
int fputc(int ch, FILE *f) {USART_SendData(USART1, (uint8_t)ch);while (!USART_GetFlagStatus(USART1, USART_FLAG_TXE));return ch;
}// 输入重定向(scanf)
int fgetc(FILE *f) {while (!USART_GetFlagStatus(USART1, USART_FLAG_RXNE));return (int)USART_ReceiveData(USART1);
}int main() {// 初始化 USART1(需自行实现)USART_InitTypeDef USART_InitStruct = { ... };USART_Init(USART1, &USART_InitStruct);USART_Cmd(USART1, ENABLE);printf("Hello, No-Semihosting!\n");  // 通过 USART1 输出int num;scanf("%d", &num);                  // 从 USART1 读取输入return 0;
}

5. 关键注意事项

功能实现要求
禁用半主机#pragma import(__use_no_semihosting)
FILE 结构体定义 struct __FILE__stdout/__stdin(可简化)
_sys_exit必须实现,建议硬件复位(NVIC_SystemReset())或死循环(while(1)
fputc重定向 printf 到硬件(如 UART)
fgetc重定向 scanf 从硬件读取(需检查 USART_FLAG_RXNE
硬件初始化确保 USART/UART 已正确配置(波特率、引脚模式等)

6. 常见问题解决

  • 问题1:printf 无输出
    • 检查 fputc 是否实现,并确认 USART 初始化正确。
  • 问题2:链接错误 undefined _sys_exit
    • 确保所有必需函数(_sys_exitfputc 等)均已实现。
  • 问题3:scanf 无法接收数据
    • 检查 fgetc 是否使用 USART_FLAG_RXNE,而非 TC 标志。

7. 扩展适配其他硬件

  • USB-CDC 重定向:替换 fputc/fgetc 为 USB 通信函数。
  • LCD 输出:修改 fputc 将字符显示到 LCD。
  • GCC 编译器:需实现 _write_read 而非 fputc/fgetc

如果需要针对 特定硬件平台(如 STM32、ESP32、NXP) 的详细配置代码,请提供具体型号!

http://www.dtcms.com/wzjs/454932.html

相关文章:

  • 长春做网站哪家好运营是做什么的
  • 厦门网站建设报价百度推广开户价格
  • 化妆品网站建设策划书网站seo哪家做的好
  • 微网站开发平台wizi百度站长工具链接提交
  • drupal做虚拟发货网站吉林seo基础知识
  • 动态网站开发概述网站制作工具有哪些
  • 新品发布会新闻稿网站的seo是什么意思
  • 做家政的在哪些网站推广济南网络推广
  • 网罗天下做网站靠谱吗制作公司网页多少钱
  • 北京企业官网网站建设张家界百度seo
  • 网站邮件系统建设招标网站外包
  • 网站建设需要到哪些知识seo关键词排名报价
  • 网络维护电话兰州快速seo整站优化招商
  • 新加坡网站制作seo论坛
  • 广州网站建设88浙江专业网站seo
  • 网站没有备案怎么申请广告网站优化公司推荐
  • 做商业网站需要注册公司吗北京企业推广
  • 免费下载图片的网站有哪些seo查询是什么
  • 网站ui界面设计奉化首页的关键词优化
  • 哪些网站专门做动漫的企业网站seo优化外包
  • 网站建设课程设计格式推广营销网络
  • 如何在百度上做公司网站交换友情链接的方法
  • 重庆住房和城乡建设厅网站济南网站建设方案
  • 怎么做网站appseo免费视频教程
  • 织梦网站怎么做404页面学会计哪个培训机构比较正规
  • 烟台城乡建设学校官方网站seo专业培训需要多久
  • 湛江专业建站公司seo关键词挖掘
  • 清华紫光做网站广告公司起名大全最新
  • 济南网站建设sdqswlapp推广营销
  • 购买网站做网页游戏策划网络营销方案