博客列表

再来一版简易的printf函数实现
发表于:2015-04-20 14:45:59 | 分类:C语言
浏览( ) | 评论( )

以前发过两版简易的串口printf函数实现,最近搞了一段时间Linux的库文件,回过头又有不同的理解。这一版函数基于MSP430F169,%d %x %o %b的实现不再由自己编写函数,而是调用MSP430-GCC的标准库函数:#include <stdlib.h>char *itoa(int num, char *str, int radix);send_fun函数指针,指向调用的UARTx的字节发送函数:void uart_printf(send_fun fun, char *fmt, .

使用GCC编译多线程的C程序
发表于:2014-12-05 10:58:01 | 分类:C语言
浏览( ) | 评论( )

在使用GCC编译有关多线程的程序时,可能会出现如下错误:undefined reference to `pthread_create'collect2: error: ld returned 1 exit status解决方法是,为GCC的编译命令增加“-lpthread”参数,比如:gcc 11-pthread-test.c -o 11-pthread-test -lpthread

使用变参函数实现STM32串口接收指定字符的功能(新版)
发表于:2014-10-27 11:28:44 | 分类:C语言
浏览( ) | 评论( )

回头看老版,才发现艾玛怎么会设计得那么复杂!新版改动的地方有:第一,不使用中断接收,而使用while来等待,因为本身函数的功能就是等待;第二,去掉各种各样的全局数组;第三,调用的函数指针更加简单;第四,采用goto语句实现各种情形下的返回和收尾工作。char UART_wait_spe_char(USART_TypeDef* USARTx, void (*fun)(void), int len, ...){    char byte = 0xFF, *p = (char *)&len + sizeof(len);    int i = 0;    uint8_t channel;    if (USARTx == USART1)        channel = USART1_IRQn;    else if (USARTx == USART2)     

使用变参函数实现STM32串口的简易printf功能(新版)
发表于:2014-10-26 02:11:21 | 分类:C语言
浏览( ) | 评论( )

第一,去掉了原来使用的goto语句,因为C语言中除了错误处理之外,不建议使用goto语句;第二,fmt和pnt的含义更加明确,它们始终指向下一个需要处理的字符和变参;第三,整理了程序结构,使它更加清晰。void uart_printf(USART_TypeDef *USARTx, char *fmt, ...){    char *pnt = (char *)&fmt + sizeof(fmt);    int len;    while (*fmt != '\0') {        if (*fmt == '%') {            if (*(fmt + 1) == 'c') {                uart_send_by

使用字符串作为变参函数的入口变参
发表于:2013-12-16 15:49:24 | 分类:C语言
浏览( ) | 评论( )

如果使用p指向函数堆栈区,那么整形或者字符型的变参就表示为:*((int *)p)使用字符串作为变参函数的入口变参时,存储在函数堆栈中的,是字符串的首地址。字符串首地址的变参表示为:(char *)*((int *)p)字符串包含的字符则依次表示为:((char *)*((int *)p))[0] 或者 *((char *)*((int *)p) + 0)((char *)*((int *)p))[1] 或者 *((char *)*((int *)p) + 1)((char *)*((int *)p))[2] 或者 *((char *)*((int *)p) + 2)

使用变参函数实现STM32串口接收指定字符的功能
发表于:2013-11-25 22:19:18 | 分类:C语言
浏览( ) | 评论( )

串口经常需要接收指定范围的字符。比如程序运行到某处,提供给用户‘A’、‘B’、‘C’、‘D’四个选项,等待用户输入。如果输入是‘A’、‘B’、‘C’、‘D’的其中一个,则跳转;否则继续等待。这个功能可以使用if判断语句来实现,它的优点是直观简单,缺点是代码有重复。如果程序中有十次这样的等待输入,就得编写十次if判断语句。所以,这里使用变参函数将这个功能整合成一个模块。// 定义在变参函数中,需要调用的显示函数,里面放置打印给用户的提示信息等等// 函数类型需要符合变参函数中的uart_func// USART_TypeDef用来选择串口号// 第一个struct uartData用来存储串口接收中断的数据和标志位// 第二个struct uartData是第一个的缓存,避免数据和标志位在处理的时候被串口接收中断更新int uxah_dis(USART_TypeDef* USARTx, struct uartData *u

使用变参函数实现STM32串口的简易printf功能
发表于:2013-11-24 17:12:34 | 分类:C语言
浏览( ) | 评论( )

如果要在串口上打印字符串和数字的混合信息,使用printf比普通的send函数要方便的多。STM32的printf设计,可以不调用标准C库函数,而使用变参函数实现。原理非常简单,只要获取了变参函数的第一个实参地址,变参地址在其基础上增加(参数的大小)即可。实现如下:int usart_printf(USART_TypeDef* USARTx, char *fmt, ...){         char *p = (char *)&fmt + sizeof(fmt);         uint8_t temp = 0, numLen = 0;         while (1) {                

C语言函数形参的执行顺序
发表于:2013-11-24 17:07:18 | 分类:C语言
浏览( ) | 评论( )

C语言中,函数形参从右往左压入堆栈。所以当执行下面这个函数时:i = 0;usart_printf(USART1, “%2d, %2d, %2d”, i, i, i++); 将会打印:01, 01, 00 而不是执行完整个函数,再++。表达式,则是先执行完整个表达式自身,再++。