基于 RTOS_SDK的 printf 独占CPU?能否改进使其打印时非独占CPU? 因为影响到其它进程的时序

dearwind153
Posts: 49
Joined: Sun Feb 28, 2016 7:47 pm

基于 RTOS_SDK的 printf 独占CPU?能否改进使其打印时非独占CPU? 因为影响到其它进程的时序

Postby dearwind153 » Fri Jun 03, 2016 12:02 am

1. 经过实验基于 RTOS_SDK的 printf 重定到UART 占用CPU直到打印完才释放CPU?能否改进使其打印时非独占CPU,因为会影响到红外发送的时序

2. 因为无法找到重定向printf的代码,请问如何改进,使得printf时非独占CPU至打印完成?


3. 另外发句牢骚,技术解答的效率太低了,本人在使用Nordic公司的蓝牙4.0芯片,同样是国外的公司,也是基于论坛提问的方法解答问题,人家相关的技术人员会非常详细及时的解决提问,贵公司的效率太低了。其实当今芯片公司拼的是技术服务,如何帮助客户快速构建产品,而不是客户猜测芯片怎么用。 :(





期待技术支持解答,谢谢!

tobewinner
Posts: 45
Joined: Tue Jan 19, 2016 2:39 pm

Re: 基于 RTOS_SDK的 printf 独占CPU?能否改进使其打印时非独占CPU? 因为影响到其它进程的时序

Postby tobewinner » Mon Jun 13, 2016 6:51 pm

目前,printf底层会调用uart_tx_one_char,官方示例中代码是这么写的:

Code: Select all

uart_tx_one_char(uint8 uart, uint8 TxChar)

{

    while (true) {

        uint32 fifo_cnt = READ_PERI_REG(UART_STATUS(uart)) & (UART_TXFIFO_CNT << UART_TXFIFO_CNT_S);



        if ((fifo_cnt >> UART_TXFIFO_CNT_S & UART_TXFIFO_CNT) < 126) {

            break;

        }

    }



    WRITE_PERI_REG(UART_FIFO(uart) , TxChar);

    return OK;

}

这样,当UART_FIFO满了之后,就会死等,直至空闲再写入FIFO直到写完,printf才返回
如果你对这种阻塞比较介意,可以自己封装自己的my_printf,比如使用以下机制:
1,自己建立发送的一个缓冲队列,调用my_printf时,如果自己的队列为空且UART的TXFIFO空间够发送的数据,直接压入UART的TXFIFO中,否则,如果队列非空则将数据压入自己的缓冲队列然后返回,队列空则压入TXFIFO数据后,将剩余的数据压入自己的缓冲队列,同时注册并打开UART_TXFIFO_EMPTY的中断(该中断可以设置TXFIFO中可用空间大于多少触发);
2,在UART_TXFIFO_EMPTY的中断处理中,将缓冲队列中逐步压入TXFIFO中,直到全部压完,关闭UART_TXFIFO_EMPTY的中断。
注:UART的中断号只有一个,中断处理函数也只有一个,至于是否为UART_TXFIFO_EMPTY的中断需要在中断处理函数中去读取UART的中断状态,另外整个过程请自己注意共享资源的保护。
这样my_printf不会死等,一般会以最高的cpu处理速度来执行。

dearwind153
Posts: 49
Joined: Sun Feb 28, 2016 7:47 pm

Re: 基于 RTOS_SDK的 printf 独占CPU?能否改进使其打印时非独占CPU? 因为影响到其它进程的时序

Postby dearwind153 » Tue Jun 14, 2016 12:05 am

谢谢,解答,我试一下您说的方法。

Who is online

Users browsing this forum: No registered users and 13 guests