打印

最近发现学习ARM和Keil for ARM最好的从软件自带的例程开始

[复制链接]
7529|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
古道热肠|  楼主 | 2011-11-25 22:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以前搞51,用顺了printf函数,而用在ARM平台上折腾,虽有仿真器联机调试,但没这函数总是不顺手,照着老办法重定义putchar函数后,想当然应该能用printf了,哪知下载到芯片中,死气沉沉,郁闷,网上搜一搜,没有搞明白,回头翻翻Keil的安装文件夹,找到一个blinky的例程,其中正如带有Printf,大喜,遂依葫芦画瓢,可然成功,原来这MDK要重载以下函数才能实现Printf。
// Implementation of sendchar (also used by printf function to output data)
   int sendchar (int ch) {                 // Write character to Serial Port
   while (!(U0LSR & 0x20));
  return (U0THR = ch);
}
int getkey (void)  {                     // Read character from Serial Port
  while (!(U0LSR & 0x01));
  return (U0RBR);
}


#pragma import(__use_no_semihosting_swi)
extern int  sendchar(int ch);           /* Defined in Serial.c                */
struct __FILE {
  int handle;                           /* Add whatever you need here         */
};
int fputc(int ch, FILE *f) {
  return (sendchar(ch));                /* Retarget fputc to serial UART      */
}
void _sys_exit(int return_code) {
  for (;;);                             /* Endless loop                       */
}


最关键的是要能搞出个fputc函数给printf用,呵呵,搞复杂了,还不如原来的简单,原来51平台只占1K,这个printf一用,代码立即附加2K多,还好ARM程序空间大。

相关帖子

沙发
Ryanhsiung| | 2011-11-26 08:00 | 只看该作者
ARM的东西比51 PIC的东西多了先多,可以一个模块的寄存是就是原先51的好几倍。
   官方的一般都是成熟的,拿来比较好!!

使用特权

评论回复
板凳
ayb_ice| | 2011-11-26 08:06 | 只看该作者
ARM的东西比51 PIC的东西多了先多,可以一个模块的寄存是就是原先51的好几倍。
   官方的一般都是成熟的,拿来比较好!!
Ryanhsiung 发表于 2011-11-26 08:00

不明白,寄存器多好吗

使用特权

评论回复
地板
Cortex-M0| | 2011-11-26 09:06 | 只看该作者
呵呵~~~

折腾无极限~~~

使用特权

评论回复
5
古道热肠|  楼主 | 2011-11-26 10:06 | 只看该作者
不明白,寄存器多好吗
ayb_ice 发表于 2011-11-26 08:06

ARM的优势是它的存储器地址寻址空间上升到32位,与硬件相关的控制、状态、数据寄存器搞它几个百个也是沧海一栗。
地址空间受限是8位单片机的软肋,早点PC用的16位CPU芯片8086为了寻址1M空间,搞得地址切换很麻烦,
哈哈,到如今32位ARM大行其道,感觉大地如此的广阔,再也不为存储空间不够而犯愁了。

使用特权

评论回复
6
hotpower| | 2011-11-26 10:40 | 只看该作者
ARM的优势是它的存储器地址寻址空间上升到32位,与硬件相关的控制、状态、数据寄存器搞它几个百个也是沧海一栗。
地址空间受限是8位单片机的软肋,早点PC用的16位CPU芯片8086为了寻址1M空间,搞得地址切换很麻烦,
...
古道热肠 发表于 2011-11-26 10:06


早该如此

使用特权

评论回复
7
john_lee| | 2011-11-26 16:32 | 只看该作者
虽然可以使用printf了,别以为就此“顺手”到底了,因为这还是需要一个串口啊,在本本上还是嫌不顺手,要更顺手怎么办?用半主机啊。

使用特权

评论回复
8
chy117| | 2011-11-26 19:24 | 只看该作者
mark

使用特权

评论回复
9
highgear| | 2011-11-26 20:11 | 只看该作者
顶。

看软件自带的文档和例程是首要的功课,升级得靠网络和自己。只要有耐心,英文好,基本上没有找不到的解决方案。

使用特权

评论回复
10
古道热肠|  楼主 | 2011-11-26 21:39 | 只看该作者
虽然可以使用printf了,别以为就此“顺手”到底了,因为这还是需要一个串口啊,在本本上还是嫌不顺手,要更顺手怎么办?用半主机啊。
john_lee 发表于 2011-11-26 16:32

请教什么叫“半主机”,不妨多多指教,在此先行谢过!
prinf函数可以将程序中的所有变量内容轻松的转换成字符串通过串口发送到PC机上,用串口调试助手看得明明白白,俺就喜欢用它。

使用特权

评论回复
11
古道热肠|  楼主 | 2011-11-26 21:42 | 只看该作者
printf还有一个兄弟sprintf 函数,可将生成的内容先送到数据缓冲区中,然后将缓冲区的内容送显示或打印等都很舒坦,真是爽歪歪。

使用特权

评论回复
12
dong_abc| | 2011-11-26 22:45 | 只看该作者
13
李富贵| | 2011-11-26 22:50 | 只看该作者
Semihosting的printf和scanf是通过JTAG口走的,在IAR里面可以用Terminal I/O窗口看到printf输出,也可以做这个窗口给scanf发送数据,MDK应该也有同样的功能。

使用特权

评论回复
14
古道热肠|  楼主 | 2011-11-26 23:46 | 只看该作者
呵呵,根据网友提示,学了一下半主机模式,顺便BaiDu了相关内容如下:
半主机
  半主机是用于 ARM 目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机。 例如,使用此机制可以启用 C 库中的函数,如 printf() 和 scanf(),来使用主机的屏幕和键盘,而不是在目标系统上配备屏幕和键盘。   这种机制很有用,因为开发时使用的硬件通常没有最终系统的所有输入和输出设备。 半主机可让主机来提供这些设备。   半主机是通过一组定义好的软件指令(如 SVC)来实现的,这些指令通过程序控制生成异常。 应用程序调用相应的半主机调用,然后调试代理处理该异常。 调试代理提供与主机之间的必需通信。   半主机接口对 ARM 公司提供的所有调试代理都是通用的。 在无需移植的情况下使用 RealView ARMulator ISS、指令集系统模型 (ISSM)、实时系统模型 (RTSM)、RealView ICE 或 RealMonitor 时,会执行半主机操作,请参阅Figure 8.1。   在很多情况下,半主机由库函数内的代码调用。 应用程序还可以直接调用半主机操作。 有关 ARM C 库中的半主机支持的详细信息,请参阅《库和浮点支持指南》中的第 2 章 C 和 C++ 库。   Figure 8.1. 半主机概述
Note
  ARMv7 之前的 ARM 处理器使用 SVC 指令(以前称为 SWI 指令)进行半主机调用。 但是,如果要为 ARMv6-M 或 ARMv7-M(如 Cortex™-M1 或 Cortex-M3 处理器)进行编译,请使用 BKPT 指令来实现半主机。

使用特权

评论回复
15
tuzihog| | 2011-12-2 21:21 | 只看该作者
MARK

使用特权

评论回复
16
dailei251337957| | 2011-12-9 10:27 | 只看该作者
学习万岁!!!

使用特权

评论回复
17
tl5324260| | 2011-12-9 10:55 | 只看该作者
学习一下

使用特权

评论回复
18
tl5324260| | 2011-12-9 10:55 | 只看该作者
学习一下

使用特权

评论回复
19
tl5324260| | 2011-12-9 10:56 | 只看该作者
学习一下

使用特权

评论回复
20
tl5324260| | 2011-12-9 10:56 | 只看该作者
学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:以VS1003B和山景SOC芯片为背景,倾心研制数字化语音录放产品. 排忧邮箱:xg_2004_sy@126.com 得意之作是做了个AVR高压编程器,用起来爽歪歪, 串口MP3录放音模块,全面进入数字录放音时代

284

主题

6411

帖子

16

粉丝