历史上的今天
返回首页

历史上的今天

今天是:2025年03月09日(星期日)

正在发生

2019年03月09日 | STM32 printf半主机模式

2019-03-09 来源:eefocus

看了原子哥的usart部分printf函数重定向的问题,自己动手试了试,单片机可以通过串口打印信息,printf函数重定向后使用十分方便。


所谓重定向是指修改printf的底层函数,使printf打印到单片机的外设中。

还有一个概念是半主机。


半主机是用于 ARM 目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机。 例如,使用此机制可以启用 C 库中的函数,如 printf() 和 scanf(),来使用主机的屏幕和键盘,而不是在目标系统上配备屏幕和键盘。


这种机制很有用,因为开发时使用的硬件通常没有最终系统的所有输入和输出设备。 半主机可让主机来提供这些设备。


半主机是通过一组定义好的软件指令(如 SVC)来实现的,这些指令通过程序控制生成异常。 应用程序调用相应的半主机调用,然后调试代理处理该异常。 调试代理提供与主机之间的必需通信。


半主机接口对 ARM 公司提供的所有调试代理都是通用的。 在无需移植的情况下使用 RealView ARMulator® ISS、指令集系统模型 (ISSM)、实时系统模型 (RTSM)、RealView ICE 或 RealMonitor 时,会执行半主机操作。


标准库使用半主机模式,半主机是通过一组定义好的软件指令 (如 SVC)SVC 指令 (以前称为 SWI 指令)来实现的,这些指令通过程序控制生成异常。 应用程序调用相应的半主机调用,然后调试代理处理该异常。调试代理(这里的调试代理是仿真器)提供与主机之间的必需通信。也就是说使用半主机模式必须使用仿真器调试。


ARMv7 之前的 ARM 处理器使用 SVC 指令 (以前称为 SWI 指令)进行半主机调用。 但是,如果要为 ARMv6-M 或 ARMv7-M (如 Cortex™-M1 或 Cortex-M3 处理器)进行编译,请使用 BKPT 指令来实现半主机。


简单的来说,半主机模式就是通过仿真器实现开发板在电脑上的输入和输出。和半主机模式功能相同的是ITM调试机制。

       上面介绍的半主机和ITM功能相当,他们都是调试机制,开发板均借助仿真器与电脑连接,实现单片机利用主机的屏幕键盘的输入输出。


这两种机制的运行均需要仿真器,否则无法运行。


       开发式一般单片机需要独立运行,开发者应去掉仿真器,把printf函数通过单片机的外设来实现,例如通过开发板的串口,lcd或者sd卡。


      MDK中通常使用以下两种方法:


方法1.使用微库,因为使用微库的话,不会使用半主机模式.

int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0);
    USART1->DR = (u8) ch;      
return ch;

}  

方法2.仍然使用标准库,在主程序添加下面代码:
#pragma import(__use_no_semihosting) 
struct __FILE 

int handle; 
}; 
FILE __stdout;       
_sys_exit(int x) 

x = x; 

int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0);//Ñ»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï   
    USART1->DR = (u8) ch;      
return ch;
}

关于 microlib

microlib 是缺省 C 库的备选库。 它用于必须在极少量内存环境下运行的深层嵌入式应用程序。 这些应用程序不在操作系统中运行。microlib 不会尝试成为符合标准的 ISO C 库。

microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。某些库函数的运行速度也比较慢,例如,memcpy()。

上面给出了正确的方法,我在测试的过程中发现方法二中注释掉#pragma import(__use_no_semihosting) 程序依然运行正确,这个很让人费解。

也有使用#pragma import(__use_no_semihosting_swi)的。这几个的区别我没弄懂。

如果使用微库或者禁用半主机,没有重定义fputc函数,程序可以运行,但不知道结果打印到主机的哪个地方去了。既没有禁用半主机也没有重定义fputc函数,程序将一直停在中断处,如图:

 

网上的大部分资料都是禁用了半主机模式,没有使用过半主机模式借助主机的键盘输入参数,看了很多资料,都是讲半主机的,但讲的内容太浅显,

我没有学会使用半主机,更多的是学会了禁用半主机模式,我们好像忽略了半主机模式的意义。

 

另外,我们可以查到的大部分资料讲解的大同小异,它们更多的告诉我们正确的步骤,而不是让我们从源头了解一个问题,当然,大部分人看重的是实用,问题解决了,也就不再去思考背后的原理。

最有效最直接最权威的资料是mdk官方给出的资料,但是资料内容太多,看起来太多,不易懂,大部分人没有看下去的欲望。我们应该让使用手册看起来更直观,更易懂,更方便查阅,更高效地查阅。


推荐阅读

史海拾趣

Advanced Ceramic X Corporation公司的发展小趣事

非常抱歉,由于我无法直接获取到Advanced Ceramic X Corporation公司的具体发展细节,因此无法为您直接编写关于该公司发展的五个具体故事。然而,我可以为您提供一种构建这类故事的框架,您可以根据这个框架,结合公司的公开信息,来编写符合要求的故事。

故事框架示例

故事一:技术突破引领市场

Advanced Ceramic X Corporation自成立以来,一直致力于陶瓷材料的研究与开发。某年,公司成功研发出一种具有极高耐高温性能的新型陶瓷材料,这一技术突破使得公司在航空航天领域获得了广泛应用,推动了公司的快速发展。随着技术的不断完善和市场需求的增长,公司逐渐成为了陶瓷材料领域的领军企业。

故事二:国际合作拓宽市场

为了进一步扩大市场份额,Advanced Ceramic X Corporation积极寻求国际合作机会。公司与欧洲一家知名陶瓷材料公司签订了战略合作协议,共同开发新型陶瓷产品。这一合作不仅提高了公司的技术水平,还拓宽了公司的国际市场,使得公司的产品在全球范围内得到了广泛应用。

故事三:环保理念驱动创新

在环保意识日益增强的背景下,Advanced Ceramic X Corporation积极响应国家环保政策,将环保理念融入产品研发和生产过程中。公司成功研发出一种环保型陶瓷材料,该材料不仅具有优异的性能,而且在生产过程中产生的污染极低。这一创新举措赢得了客户的广泛赞誉,也提升了公司的品牌形象。

故事四:人才培养与团队建设

Advanced Ceramic X Corporation深知人才是企业发展的核心动力。公司注重人才培养和团队建设,通过定期举办技术培训、团队建设活动等方式,提高员工的业务能力和团队协作能力。同时,公司还积极引进国内外优秀人才,为公司的长远发展奠定了坚实的基础。

故事五:社会责任与公益事业

作为一家有社会责任感的企业,Advanced Ceramic X Corporation积极参与公益事业。公司捐资支持教育事业、扶贫济困等公益活动,为社会发展贡献自己的力量。同时,公司还关注员工福利,为员工提供良好的工作环境和福利待遇,增强了员工的归属感和忠诚度。

请注意,上述故事仅为示例,并未涉及Advanced Ceramic X Corporation公司的具体发展情况。您可以根据公司的实际情况和公开信息,结合上述框架来编写符合要求的故事。在编写过程中,请确保只描述事实,避免加入个人主观评价。

AMI [American Megatrends Inc]公司的发展小趣事

AMI(American Megatrends Inc)是一家全球领先的硬件和软件解决方案提供商,主要专注于计算机主板固件、嵌入式系统管理和云计算服务。以下是关于AMI公司发展的五个相关故事:

  1. 公司创立与起步阶段:AMI公司于1985年成立于美国佐治亚州的诺克罗斯,并在当地建立了总部。公司创始人为S. Shankar和Pat Sarma。最初,AMI专注于为个人计算机和服务器等设备提供BIOS(基本输入/输出系统)固件,为计算机硬件行业奠定了基础。

  2. BIOS技术创新:AMI在BIOS领域进行了持续的技术创新,不断推出新的功能和改进。公司开发了多个版本的AMI BIOS,包括AMI WinBIOS、AMI Aptio和AMI UEFI BIOS等。这些BIOS版本在计算机硬件市场上得到了广泛应用,为用户提供了稳定可靠的固件解决方案。

  3. 嵌入式系统管理解决方案:除了BIOS固件,AMI还致力于开发和提供嵌入式系统管理解决方案。这些解决方案包括远程管理、监控、诊断和维护等功能,用于企业服务器、网络设备、嵌入式系统和物联网(IoT)设备等领域。

  4. 合作伙伴关系与生态系统建设:AMI与全球各种硬件和软件供应商建立了紧密的合作伙伴关系,共同推动技术创新和产品发展。公司与主板制造商、芯片厂商、系统集成商和软件开发商等合作,为客户提供全面的解决方案和支持服务。

  5. 云计算服务和新兴技术领域:随着云计算和人工智能等新兴技术的发展,AMI也开始拓展业务领域,提供云计算服务和相关解决方案。公司致力于为客户提供高性能、高可靠性的云计算平台和服务,以满足不断增长的数据处理和存储需求。

这些故事展示了AMI公司从创立初期到如今在BIOS技术创新、嵌入式系统管理、合作伙伴关系建设和拓展新兴技术领域等方面取得的重要进展。AMI作为一家全球知名的硬件和软件解决方案提供商,持续致力于为客户提供创新的产品和卓越的服务。

Fabrimex AG公司的发展小趣事

1982年,Fabrimex AG收购了瑞士领先的实验室电源制造商Erlenbach的K. Witmer Elektronik AG博士。这一收购不仅增强了公司在实验室电源领域的实力,还进一步巩固了其在电子行业中的地位。通过整合双方的技术和资源,Fabrimex AG在实验室电源领域取得了更高的市场份额和更广泛的客户认可。

Eurotech公司的发展小趣事

随着全球对环保问题的日益关注,Eurofarad公司也积极响应这一趋势。公司注重环保理念在产品设计和生产过程中的应用,努力减少对环境的影响。同时,公司还积极推动可持续发展战略,通过优化生产流程和采用环保材料等方式,降低能源消耗和废弃物排放。这些努力不仅符合了社会的期望,也为公司的长期发展提供了有力保障。

Horizon Electronics Enterprises Group公司的发展小趣事

为了应对市场需求的多样化和技术发展的快速变化,Horizon开始实施多元化产品布局战略。公司不仅继续深耕半导体芯片领域,还逐步拓展至电子元器件、智能设备、物联网解决方案等多个领域。通过自主研发和合作并购等方式,Horizon不断丰富产品线,满足不同客户的多样化需求。这一战略的实施不仅增强了公司的市场竞争力,也为公司的持续发展注入了新的动力。

Hasco Relays and Electronics International Corp公司的发展小趣事

进入21世纪后,Harris公司经历了重要的战略转型。2019年,Harris与L3 Technologies合并成立了L3Harris Technologies。这次合并旨在通过整合两家公司的技术、资源和市场优势,打造一家综合性的国防和信息技术公司。合并后的L3Harris在通信系统、雷达系统、太空和导航系统等多个领域均取得了显著进展,进一步提升了其在电子行业中的竞争力。

问答坊 | AI 解惑

I2C 总线接口器件的应用设计

自己找的 分享一下 还有VHDL的编程…

查看全部问答>

3个影响职场心态的故事

故事之一:你的心过门了吗?     洞房花烛夜,当新郎兴奋地揭开新娘的盖头,羞答答的新娘正低头看着地上,忽然间掩口而 笑,并以手指地:“看,看,看老鼠在吃你家的大米。“第二天早上,新郎还在酣睡,新娘起得床来,一声怒喝: ...…

查看全部问答>

SQLCE的RDA通信问题

A、开发环境是:windows xp sp3 + sql server 2005 + visual studio 2005 B、需要实现的功能:使用SQL server 提供的RDA方式,在PC的数据库和手机(windows mobile 6.0)的数据库(sql server ce)之间进行通信。需要用GPRS连通。 C、现在已实现 ...…

查看全部问答>

SD卡的密码擦出

           u8 param[6] = { 0x6A,0x00,0x00,0x00,0x00,0x95} ;                sdEnable();         SPIDelay( 1 ) ;       &n ...…

查看全部问答>

请问这个NDS是什么功能的设备呀?上网搜不到

我在控制面板-->电源-->设备状态里面看见2个设备一个是NDS0,另外一个是PWR1 我的电路板是qq2440 wince5.0 请问这个NDS是什么功能的设备呀?上网搜不到…

查看全部问答>

pxa270 wince5.0下可以用Usb otg吗?

想问一下大家,pxa270 wince5.0下可以用Usb otg吗?我在wince6.0下看到有Usb otg的驱动,但是在5.0下没有,device和host是分开的,不知道在5.0下可以用usb otg吗?…

查看全部问答>

STM32在Keil创建工程的问题!!!!

我用的v3.0.0库!!!请大虾帮我看看哪里出问题了!!!     急急啊!!!!…

查看全部问答>

430新手求开发环境

去年挖宝得了一个LaunchPad,想玩一下,求一个CCS4.0的下载地址,CCS是TI自己的吗?在官网上没找到。有用过的给你地址! 另外有在LaunchPad写过程序的给在下几个程序玩玩!谢谢!…

查看全部问答>

菜鸟问:本地端口号和远程主机端口号需要一样吗?

如图所示:tcp_bind()和tcp_connect()这两个函数中的\"port\"参数需要设置的一样吗? tcp_bind()中port是本地端口号,意思是LM3S和服务器相连的端口, tcp_connect()中的port是远程主机的端口号,也就是服务器的端口号,应该可以设为不一样的吧? ...…

查看全部问答>

uboot的内存命令使用mw(修改)md(显示)

修改:mw [内存地址] [值] [长度]    例如:mw 0x02000000 0 128    表示修改地址为0x02000000~0x02000000+128的内存值为0.    显示:md [内存地址] [长度]例如:md 0x02000000 128    表示显示0x02000000的 ...…

查看全部问答>