打印
[ARM入门]

关于裸板里面怎么用printf函数

[复制链接]
1266|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Damon_回归|  楼主 | 2015-6-1 20:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Damon_回归 于 2016-6-4 13:54 编辑

有二种方法可以做!第一种方法就是用u-boot里面的printf,第二种方法就是自己直接写个printf函数!
                第一方法就是先知道u-boot里面的printf函数的地址在那里!那么下面例子就是操作nand,把id打印出来!
                test.S
                        typedef volatile unsigned int u32;
                        typedef volatile unsigned char u8;
                        #define NFCONF *(u32 *)0x70200000        
                        #define NFCONT *(u32 *)0x70200004
                        #define NFCMMD *(u8 *)0x70200008
                        #define NFADDR *(u8 *)0x7020000C
                        #define NFDATA *(u8 *)0x70200010
                        void (*printf)(char *, ...) = (void *)0x57e11df8;
                        void _start()
                          {
                             NFCONF = (3 << 12)|(2 << 8)|(1 << 4)|(1 << 2);
                             / /tacls = 3, twrph0 = 3, twrph1 = 2
                           NFCONT = 1;
                          NFCMMD = 0x90;      
                           NFADDR = 0;     
                          printf("%02x\n", NFDATA);
                            printf("%02x\n", NFDATA);
                          printf("%02x\n", NFDATA);
                         printf("%02x\n", NFDATA);  
                        printf("%02x\n", NFDATA);
                        }

                    Makefile
                          
all:
arm-none-linux-gnueabi-gcc -c test.c -o test.o -fno-builtin
arm-none-linux-gnueabi-ld -T test.lds test.o -o test
arm-none-linux-gnueabi-objcopy -O binary test /tftpboot/test.bin

    第2种方法自己写了啊!

   
#include <stdio.h>
void printf_int(int val)
{
if (val <=0)
  return ;
printf_int(val/10);
putchar(val%10+'0');
}
void printf_hex(int val)
{
if (val <=0)
  return ;
printf_hex(val/16);
putchar(val%16+'0');
}
void printf_float(float val)
{
int i;
printf_int(val);
putchar('.');

val=val-(int)val;
for(i=0;i<6;i++)
{
  val=val*10;
  putchar((int)val%10+'0');
}
}
void my_printf(char *cmd,...)
{
int *addr=(void *)&cmd;
int num=0;
while(*cmd)
{
  while(*cmd &&(*cmd != '%'))
   putchar(*cmd++);
  if(*cmd=='\0')
   break;
  cmd++;
  num++;
  switch(*cmd)
  {
   case 'c' :putchar(*(addr+num));
    break;
   case 's' :puts((char *)*(addr+num));
    break;
   case 'd': printf_int(*(addr+num));
                                break;
                        case 'p': printf_hex(*(addr+num));
                                break;
//  case 'f' : printf_float(*(addr+num));
//   break;
  }
  cmd++;
}
}
int main(void)
{
    int i=2;
  my_printf("%d\n",i);
  //printf_float(21.045);
return 0;
}
现在float支持部了,有点问题!!!函数printf_foat可以单独使用,所以现在还在调试中!!!
第一种方法怎么在那个地址里面找到相应的printf函数地址呢,那么在boot.map里面去找
可以加qq群 D.T.Software入口群 199546072 交流学习

相关帖子

沙发
hgjinwei| | 2015-6-2 13:15 | 只看该作者
//  case 'f' : printf_float(*(addr+num));

浮点存储机制与整形不一致,你不能按整形存储格式提取浮点数

使用特权

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

本版积分规则

6

主题

9

帖子

0

粉丝