PS:遗留问题已解决
在uTenux工程中使用printf(非microlib)
前段时间说过过microlib的事情,那时在百度上找到的答案是使用microlib来解决。但是由于microlib的效率和不确定性,uTenux中没有使用这个东西。因此那种使用printf的方法也就不能用了。
今天看英倍特的一个例子,偶然间发现它也在用printf,看了一下没有使用microlib。
于是照葫芦画瓢,也在工程里边加上了printf的功能。下面是步骤:
1、编辑分散加载描述文件:kernel-rom.sct。最后的效果是这样的:
LOAD_INTERFLASHROM 0x08000000 0x00100000 { ; load region size_region
EXEC_INTERROM 0x08000000 0x00100000 { ; load address = execution address
* (.vector,+First) ; 1024k
*(InRoot$$Sections)
.ANY (+RO)
}
EXEC_VECTORRAM 0x20000000 0x00000400 { ; vector table region in ram
} ; 1k
EXEC_BSSDATARAM 0x20000400 0x00001c00 { ; zi and rw data region in ram
.ANY (+RW +ZI)
} ; 7k
EXEC_SYSTEMRAM 0x20002000 0x00019000 { ; ut/kernel management region
} ; 100k
EXEC_USERRAM 0x2001b000 0x00001000 { ; user manual region in ram
} ; 4k
EXEC_STACKRAM 0x2001c000 0x00000000 { ; default stack top
} ; 0k
ARM_LIB_HEAP 0x20007000 EMPTY 0x400
{
}
ARM_LIB_STACK 0x20007FFC EMPTY -0x400
{
}
} ;
参考百度的结果。我增加了两行,ARM_LIB_HEAP 0x20007000 EMPTY 0x400和ARM_LIB_STACK 0x20007FFC EMPTY -0x400
如果不加,就会报链接错误:armlink Error: L6915E
参考在这里:http://blog.sina.com.cn/s/blog_5c4dd3330100s3yk.html
我不了解sct文件的写法,只是简单的复制了一下。
2、从写printf的实现函数fputc,这是老方法了,一直用。
//重定义printf
int fputc(int ch,FILE *f)
{
//检查发送寄存器为空之后再往里边放数据
while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET)
{}
//USART发送一个字符
USART_SendData(USART3, (uint8_t) ch);
return ch;
}
3、使用printf,正常用,没啥差别。