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库吗?还是我的姿势不对?
肯定是我的姿势不对,各位大佬帮我看看这是什么问题。
|