2556|1

47

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

ARM裸机编程如何连接C标准库 [复制链接]

main.c  

#include <stdio.h>
#include "uart.h"

#define GPBCON	*(volatile unsigned int*)(0x56000010)
#define GPDAT	*(volatile unsigned int*)(0x56000014)

int delay(unsigned int count)
{
	while(count--);
}

int main(void)
{
	int c;
	char buf[100];
	double A = 1.1f;

	uart0_init();
	puts("Hello, world!\n\r");
	
	while(1)
	{
		printf("%d,%s,0x%02x,0x%08X\r\n", -123,"hello world",0x12,c+=1);

    	puts(buf);
		puts("\r\nHello world\r\n");

		delay(50000);
	}
	return 0;
}

其中uart.c

#include "s3c2440_soc.h"


/* 115200,8n1 */
void uart0_init()
{
	/* 设置引脚用于串口 */
	/* GPH2,3用于TxD0, RxD0 */
	GPHCON &= ~((3<<4) | (3<<6));
	GPHCON |= ((2<<4) | (2<<6));

	GPHUP &= ~((1<<2) | (1<<3));  /* 使能内部上拉 */
	

	/* 设置波特率 */
	/* UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
	 *  UART clock = 50M
	 *  UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26
	 */
	UCON0 = 0x00000005; /* PCLK,中断/查询模式 */
	UBRDIV0 = 26;

	/* 设置数据格式 */
	ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */

	/*  */

}

int putchar(int c)
{
	/* UTRSTAT0 */
	/* UTXH0 */

	while (!(UTRSTAT0 & (1<<2)));
	UTXH0 = (unsigned char)c;
	
}

int getchar(void)
{
	while (!(UTRSTAT0 & (1<<0)));
	return URXH0;
}

int puts(const char *s)
{
	while (*s)
	{
		putchar(*s);
		s++;
	}
}

这是Makefile

LIBPATH=-lgcc -L/mango/workSoft/arm-linux-gcc-4.4.3/lib/gcc/arm-none-linux-gnueabi/4.4.3

ALL:
	    arm-linux-gcc -c -o start.o start.S    
		arm-linux-gcc -std=c99 -c -o main.o main.c 
		arm-linux-gcc -std=c99 -c -o uart.o uart.c 
	    arm-linux-ld  -Ttext 0 start.o main.o uart.o -o output.elf -lc ${LIBPATH} 
	    arm-linux-objcopy -O binary -S output.elf output.bin   
	    arm-linux-objdump -D output.elf > output.dis  
		mkdir bulid
		mv *.o *.elf *.bin *.dis bulid    
clean:
	    rm -r bulid
.PHONY: clean

如上代码,编译是正常编译的。

但是代码一直在重启,去掉printf的调用,只使用puts则是正常的。

难道裸机编程不能调用标准c库吗?还是我的姿势不对?

肯定是我的姿势不对,各位大佬帮我看看这是什么问题。

 

此帖出自ARM技术论坛

最新回复

1, 楼主既然是裸arm(没有os),编译应该用arm-none-eabi-gcc. 2, printf 跑在裸机上,需要 retarget. 搜一下 retarget print() 可解.  详情 回复 发表于 2020-6-25 13:21
点赞 关注
 

回复
举报

48

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
1, 楼主既然是裸arm(没有os),编译应该用arm-none-eabi-gcc.
2, printf 跑在裸机上,需要 retarget. 搜一下 retarget print() 可解.
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表