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_INTERROM0x08000000 0x00100000{; load address = execution address
* (.vector,+First);1024k
*(InRoot$$Sections)
.ANY (+RO)
}
EXEC_VECTORRAM0x20000000 0x00000400{; vector table region in ram
};1k
EXEC_BSSDATARAM0x20000400 0x00001c00{; zi and rw data region in ram
.ANY (+RW +ZI)
};7k
EXEC_SYSTEMRAM0x20002000 0x00019000{; ut/kernel management region
};100k
EXEC_USERRAM0x2001b000 0x00001000{; user manual region in ram
};4k
EXEC_STACKRAM0x2001c000 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,正常用,没啥差别。