ESP8266 Developer Zone The Official ESP8266 Forum 2016-06-14T00:05:47+08:00 https://bbs.espressif.com:443/feed.php?f=7&t=2249 2016-06-14T00:05:47+08:00 2016-06-14T00:05:47+08:00 https://bbs.espressif.com:443/viewtopic.php?t=2249&p=7296#p7296 <![CDATA[Re: 基于 RTOS_SDK的 printf 独占CPU?能否改进使其打印时非独占CPU? 因为影响到其它进程的时序]]> Statistics: Posted by dearwind153 — Tue Jun 14, 2016 12:05 am


]]>
2016-06-13T18:51:25+08:00 2016-06-13T18:51:25+08:00 https://bbs.espressif.com:443/viewtopic.php?t=2249&p=7295#p7295 <![CDATA[Re: 基于 RTOS_SDK的 printf 独占CPU?能否改进使其打印时非独占CPU? 因为影响到其它进程的时序]]>

Code:

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处理速度来执行。

Statistics: Posted by tobewinner — Mon Jun 13, 2016 6:51 pm


]]>
2016-06-03T00:02:54+08:00 2016-06-03T00:02:54+08:00 https://bbs.espressif.com:443/viewtopic.php?t=2249&p=7185#p7185 <![CDATA[基于 RTOS_SDK的 printf 独占CPU?能否改进使其打印时非独占CPU? 因为影响到其它进程的时序]]>
2. 因为无法找到重定向printf的代码,请问如何改进,使得printf时非独占CPU至打印完成?


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





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

Statistics: Posted by dearwind153 — Fri Jun 03, 2016 12:02 am


]]>