- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前无法让 LPUART 中断在 NXP FRDM K82f board 上正常工作与 MCUXpresso IDE使用 MCUXpresso SDK .
LPUART 中断仅触发 6-8 次,之后再也不会触发。此行为独立于代码中的当前位置。我通过在程序进入无限循环很久之后发送第一批数据以及在程序开始时发送它(在 lpuart 中断初始化之后)来测试它。两种情况下的行为相同。
这是我的初始化例程和中断处理程序。
#include <stdint.h>
#include "fsl_lpuart.h"
#define OSCERCLK_SOURCE 2U
#define ESP_UART LPUART0
#define UART_IRQ LPUART0_IRQn
#define UART_RECEIVE_INTERRUPT LPUART0_IRQHandler
#define BUFFER_SIZE 2048
volatile uint8_t ringBuffer[BUFFER_SIZE] = {0x00};
volatile uint16_t rxIndex = 0;
volatile uint16_t txIndex = 0;
void init(uint32_t baudRate){
lpuart_config_t config;
CLOCK_SetLpuartClock(OSCERCLK_SOURCE);
LPUART_GetDefaultConfig(&config);
config.baudRate_Bps = baudRate;
config.enableRx = true;
config.enableTx = true;
uint32_t clockFrequency = CLOCK_GetFreq(kCLOCK_Osc0ErClk);
LPUART_Init(ESP_UART, &config, clockFrequency);
LPUART_EnableInterrupts(ESP_UART, kLPUART_RxDataRegFullInterruptEnable);
EnableIRQ(UART_IRQ);
}
void UART_RECEIVE_INTERRUPT(void){
uint8_t data;
uint32_t flags = kLPUART_RxDataRegFullFlag & LPUART_GetStatusFlags(ESP_UART);
if (flags){
data = LPUART_ReadByte(ESP_UART);
if((rxIndex + 1) % BUFFER_SIZE != txIndex){
ringBuffer[rxIndex] = data;
rxIndex++;
rxIndex %= BUFFER_SIZE;
}
}
}
有没有人遇到过类似的行为并且能够提供帮助?
编辑:正如@Lundin 建议的那样,我更正了非标准的 gcc 语法。还没有成功,但我能够跟踪当 ISR 不再触发时设置了哪些标志。设置的标志是:
kLPUART_TxDataRegEmptyFlag,
kLPUART_IdleLineFlag,
kLPUART_RxOverrunFlag,
kLPUART_RxFifoEmptyFlag
这在我看来是模棱两可的,因为 RX FIFO 是空的并且 RX 也溢出了。
最佳答案
您首先需要弄清楚的事情之一是您是在使用 FIFO,还是只是处理单字符接收数据寄存器。如果你没有使用 FIFO,那么 FIFO 标志是无关紧要的,它显示为空也就不足为奇了。
至于溢出标志,程序员的手册是毫不奇怪的解释:
Receiver Overrun Flag
OR is set when software fails to prevent the receive data register from overflowing with data. The OR bit isset immediately after the stop bit has been completely received for the dataword that overflows the bufferand all the other error flags (FE, NF, and PF) are prevented from setting. The data in the shift register islost, but the data already in the LPUART data registers is not affected....
这表明很可能在过去的某个时候您未能在数据被覆盖之前声明数据,从而设置溢出标志。但是,如果您对原始接收数据中断也有延迟响应,您可能会在没有意识到问题的情况下读取原始数据。但是,如果您这样做了,并且让溢出标志保持打开状态,那将是您收到的最后一个数据。
看来您至少需要做三件事:
完全实现或完全忽略可选的 FIFO 模式
检查溢出标志,清除它以查看它是否有所不同,但也找到一种方法来指示(设置一个粘性 volatile 软件标志,在一次触发模式下切换示波器监视的 GPIO,无论如何) 表示出现了问题,以便您可以采取措施进行调查。
全面分析和测试您的程序,找出可能导致无法足够快地响应串行数据的设计错误。这可能包括诸如在 ISR 中切换 GPIO 并观察它和示波器上的串行数据线、将计时器检查放入代码以及审核所有其他 ISR 和任何必须禁用中断的前台选项之类的事情。也尝试剥离你的程序,直到你只有一些东西可以接收和回显字符并试验它,在终端程序中一次按下一个键,并让程序以保持串行线路 100% 繁忙的速率注入(inject)字符串.
另外请记住,虽然断点调试可能非常强大,但对于任何必须响应外部事件的程序,很可能在第一次命中断点后运行将不再正常,因此接近以这种方式出现问题,您通常需要设计在遇到断点的点结束的测试,并且您只分析到该点为止收集的状态。有时这意味着您需要一个“if”条件,以便您可以在其中放置一个断点。
关于c - FRDM K82f uart 中断仅触发约 8 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48583640/
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我们可以说 O(K + (N-K)logK)相当于O(K + N logK)对于 1 < = K <= N ? 最佳答案 简短的回答是它们不等价,这取决于k 的值。如果k等于N,那么第一个复杂度是O(
我有以下解决方案,但我从其他评论者那里听说它是 O(N * K * K),而不是 O(N * K)其中 N 是 K 列表的(最大)长度,K 是列表的数量。例如,给定列表 [1, 2, 3] 和 [4,
我试图理解这些语法结构之间的语义差异。 if ((i% k) == (l % k) == 0) 和 if ((i % k) == 0 && (l % k) == 0) 最佳答案 您的特定表达式((i
我有时会使用一维数组: A = np.array([1, 2, 3, 4]) 或 2D 阵列(使用 scipy.io.wavfile 读取单声道或立体声信号): A = np.array([[1, 2
在文档聚类过程中,作为数据预处理步骤,我首先应用奇异向量分解得到U、S和Vt 然后通过选择适当数量的特征值,我截断了 Vt,这让我从阅读的内容中得到了很好的文档-文档相关性 here .现在我正在对矩
我问的是关于 Top K 算法的问题。我认为 O(n + k log n) 应该更快,因为……例如,如果您尝试插入 k = 300 和 n = 100000000,我们可以看到 O(n + k log
这个问题与另一个问题R:sample()密切相关。 。我想在 R 中找到一种方法来列出 k 个数字的所有排列,总和为 k,其中每个数字都是从 0:k 中选择的。如果k=7,我可以从0,1,...,7中
我目前正在评估基于隐式反馈的推荐系统。我对排名任务的评估指标有点困惑。具体来说,我希望通过精确度和召回率来进行评估。 Precision@k has the advantage of not requ
我在 Python 中工作,需要找到一种算法来生成所有可能的 n 维 k,k,...,k 数组,每个数组都沿轴有一行 1。因此,该函数接受两个数字 - n 和 k,并且应该返回一个数组列表,其中包含沿
我们有 N 对。每对包含两个数字。我们必须找到最大数 K,这样如果我们从给定的 N 对中取 J (1 2,如果我们选择三对 (1,2),我们只有两个不同的数字,即 1 和 2。 从一个开始检查每个可能
鉴于以下问题,我不能完全确定我当前的解决方案: 问题: 给定一个包含 n 元素的最大堆,它存储在数组 A 中,是否可以打印所有最大的 K 元素在 O(K*log(K)) 中? 我的回答: 是的,是的,
我明白了: val vector: RDD[(String, Array[String])] = [("a", {v1,v2,..}),("b", {u1,u2,..})] 想转换成: RDD[(St
我有 X 个正数,索引为 x_i。每个 x_i 需要进入 K 组之一(其中 K 是预先确定的)。令 S_j 为 K_j 中所有 x_i 的总和。我需要分配所有 x_i 以使所有 S_j 的方差最小化。
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我正在研究寻找原始数的算法,看到下面的语句,我不明白为什么。 while (k*k <= n) 优于 while (k <= Math.sqrt(n)) 是因为函数调用吗?该调用函数使用更多资源。 更
我想找到一种尽可能快的方法来将两个小 bool 矩阵相乘,其中小意味着 8x8、9x9 ... 16x16。这个例程会被大量使用,所以需要非常高效,所以请不要建议直截了当的解决方案应该足够快。 对于
有没有一种惯用的方法来获取 Set和 Function ,并获得 Map实时取景? (即 Map 由 Set 和 Function 组合支持,例如,如果将元素添加到 Set ,则相应的条目也存在于 M
这个问题在这里已经有了答案: Can a local variable's memory be accessed outside its scope? (20 个答案) returning addr
给定一个矩阵:- k = [1 2 3 ; 4 5 6 ; 7 8 NaN]; 如果我想用 0 替换一个数字,比如 2,我可以使用这个:k(k==2) =
我是一名优秀的程序员,十分优秀!