没有操作系统、以下串行端口中断功能可以正常打印信息。
空 UARTIntHandler (空)
{
uint32_t ui32Status;
字符数据;
//获取中断状态。
ui32Status = ROM_UARTIntStatus (UART0_BASE、TRUE);
//清除已发出的中断。
ROM_UARTIntClear (UART0_BASE、ui32Status);
//在接收 FIFO 中有字符时循环。
while (ROM_UARTCharsAvail (UART0_BASE))
{
//从 UART 读取下一个字符。
数据= ROM_UARTCharGetNonBlocking (UART0_BASE);
/*检查环形缓冲区是否有可用空间并输入数据*/
如果(!RingBufFull (&sUartRing)){
RingBufWriteOne (&sUartRing,数据);
}
}
}
2. 在 ucos3系统中,1的中断功能异常,部分内容被打印,但 下面的串行端口中断功能可以正常打印信息。
空 UARTStdioIntHandler (空)
{
uint32_t ui32Ints;
int8_t cChar;
int32_t i32char;
静态 bool bLastWasCR = false;
//
//获取并清除当前中断源
//
ui32Ints = MAP_UARTIntStatus (g_ui32Base、true);
MAP_UARTIntClear (g_ui32Base、ui32Ints);
//
//我们是否因为 TX FIFO 有可用空间而被中断?
//
IF (ui32INT 和 UART_INT_TX)
{
//
//将尽可能多的字节移入发送 FIFO。
//
UARTPrimeTransmit (g_ui32Base);
//
//如果输出缓冲区为空,请关闭发送中断。
//
if (TX_buffer_empty)
{
MAP_UARTIntDisable (g_ui32Base、UART_INT_TX);
}
}
//
//我们是否因为接收到的字符而被中断?
//
IF (ui32INT 和(UART_INT_RX | UART_INT_RT)
{
//
//从 UART 获取所有可用字符。
//
while (map_UARTCharsAvail (g_ui32Base))
{
//
//读取字符
//
i32Char = MAP_UARTCharGetNonBlocking (g_ui32Base);
cChar =(unsigned char)(i32Char & 0xFF);
//
//如果禁用了回显,我们将跳过各种文本过滤
//支持时通常需要的操作
//命令行。
//
if (!g_bDisableEcho)
{
//
//通过擦除中的最后一个字符来处理退格
//缓冲区。
//
if (cChar ='\b')
{
//
//如果缓冲区中已经有任何字符,那么
//删除最后一个。
//
if (!RX_buffer_empty)
{
//
//擦除用户上一个字符
//终端。
//
UARTwrite ("\b\b\b"、3);
//
//减少缓冲区中的字符数。
//
if (g_ui32UARTRxWriteIndex = 0)
{
G_ui32UARTRxWriteIndex = UART_RX_buffer_size - 1;
}
其他
{
g_ui32UARTRxWriteIndex--;
}
}
//
//跳过以读取下一个字符。
//
继续;
}
//
//如果此字符为 LF,最后一个字符为 CR,则只能起作用
//因为我们已经回传了之前的 CR 和我们的字符
//如果没有,则不想在缓冲区中存储2个字符
//需要。
//
if ((cChar ='\n')&& bWasLastCR)
{
bLastWasCR = false;
继续;
}
//
//查看是否接收到换行符或转义字符。
//
if ((cChar ='\r')||(cChar ='\n')||(cChar == 0x1b)
{
//
//如果字符是 CR,则可以后跟一个
// LF、应与 CR 配对。 请记住这一点
//收到一个 CR。
//
if (cChar ='\r')
{
bLastWasCR = 1;
}
//
//无论接收到的线路端接字符是什么,
//在接收缓冲区中放置一个 CR 作为标记指示
// UARTges()行结束的位置。 我们还发送
//增加 LF 以确保本地端子回波
//接收 CR 和 LF。
//
CChar ='\r';
UARTwrite ("\n"、1);
}
}
//
//如果接收缓冲区中有空格,请输入字符
//否则将其丢弃。
//
if (!RX_buffer_full)
{
//
//将新字符存储在接收缓冲区中
//
G_pcUARTRxBuffer[g_ui32UARTRxWriteIndex]=
(unsigned char)(i32Char & 0xFF);
Adv_RX_buffer_index (g_ui32UARTRxWriteIndex);
//
//如果启用了回显,请将字符写入发送
//缓冲区、以便用户获得一些即时反馈。
//
if (!g_bDisableEcho)
{
UARTwrite((const char *)&cChar、1);
}
}
}
//
//如果我们向发送缓冲区写入任何内容,请确保它是实际的
//进行传输。
//
UARTPrimeTransmit (g_ui32Base);
MAP_UARTIntEnable (g_ui32Base、UART_INT_TX);
}
}
在中断函数2中、在代码工程中、添加 printf 函数也会打印一部分信息。
之前的打印信息由 UARTPrint 打印。
总之、调用1描述的中断并调用 printf 时、问题与之类似。
这两个中断之间的区别是什么、除了打开 RX、断开 RT 和 TX (这不影响打印信息)
请帮助分析和解释上述情况。