问题标签 [lpc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
687 浏览

c - LPC1788 微控制器的原子测试和设置

我正在使用 NXP LPC1788 微控制器,并且正在用 C 语言开发一个多线程应用程序。在我的应用程序的一部分中,我定义了一个自定义链表数据结构。由于对特定列表的并发访问,我之前的程序遇到了问题,我似乎已经通过为列表实现“锁定获取”方法和“锁定释放”方法解决了这些问题,线程可以在访问列表本身之前调用这些列表。

我通过在列表结构中添加一个“sema”数据成员来做到这一点:

我的“锁定获取”方法如下:

我的“锁定释放”方法如下:

一般来说,这似乎工作正常,因为我的应用程序涉及每秒数千次向这样的列表添加和删除项目,并且从那以后我没有注意到任何与并发访问相关的错误。

但是,为了更有信心这样做,我想知道是否有任何方法可以实现测试和设置方法。LPC1788 依赖于特定于 Cortex-M3 微控制器的 Thumb 指令集版本,可在此处或第 918 页的用户手册中找到该版本。

但是,通过它,我找不到像测试和设置指令这样的东西。我可能只是忽略了它。

理想情况下,我想要这样的东西:

编辑

根据 Nemo 的回答,我尝试了以下方法:

如果有帮助,这是相应的汇编代码:

我无法重现并发访问问题(假设这是我遇到的并发问题),所以我不确定这是否有效。

0 投票
1 回答
301 浏览

c - 如何提高 LPC1788 微控制器调用 CAN IRQ 的速率?

我正在使用 IAR Embedded Workbench IDE 为 NXP LPC1788 微控制器开发一个应用程序,其中一个要求是尽快从 CAN1 端口接收 CAN 消息。我的问题是,在 CAN IRQ 的一次调用开始和下一次调用开始之间似乎存在约 270 微秒的延迟,即使微控制器似乎只需要约 30 微秒来处理中断。

除了这个中断之外,我还安排了每 50 微秒一次的定期定时器中断,该中断处理接收到 CAN 和 USB 消息。但是,如果没有要处理的 CAN 或 USB 消息,则此中断例程需要约 3 微秒,如果有则只需约 80 微秒。

正因为如此,我想知道为什么 CAN IRQ 的触发速度不能超过每 270 微秒,以及我能做些什么来解决这个问题。

USB 中断对性能的影响可以忽略不计,因为 USB 消息比 CAN 消息更不频繁地到达,而且我确定即使从未触发此中断也会出现此问题。

目前,我的应用程序似乎能够处理平均到达间隔时间约为 300 us 的 CAN 消息(测试以 1 ms 的间隔生成 3 条消息,处理了大约 500,000 条消息,丢弃率为 0%)。

此代码初始化 CAN:

这用于运行 CAN:

这是 CAN IRQ 代码:

COMMS_NotifyCANMessageReceived代码:

这是我的定时器中断代码,每 50 微秒触发一次:

以下是运行应用程序时典型事件日志的摘录,消息之间的平均到达间隔时间为 200 us:

在哪里:

  • 0xAAAAAAAA表示 CAN IRQ 的开始。
  • 0xBBBBBBBB表示 CAN IRQ 的结束。
  • 0x88888888表示interpretMessage在定时器 IRQ 内将要处理一条 CAN 报文。
  • 0x99999999表示我们已经从interpretMessage.

您可以看到,尽管消息每 200 us 到达,但 CAN IRQ 仅每约 270 us 为它们提供服务。这会导致接收队列不断增加,直到最终消息开始被丢弃。

任何帮助,将不胜感激。

编辑 1

我也许还应该提到我的 CAN 外围设备被编程为以 500 kBaud 的速率运行。此外,我的应用程序涉及回显接收到的 CAN 消息,因此任何到达端口 1 的消息都会在端口 2 上重新传输。

编辑 2

CAN 和 TIMER_0 中断例程具有相同的优先级:

编辑 3

我可以确认问题仍然存在,即使我禁用定时器中断并且让 CAN IRQ 除了将接收到的 CAN 消息复制到 RAM 并释放接收缓冲区之外什么也不做,中断之间的 ~270 us 间隔几乎没有变化。

0 投票
1 回答
157 浏览

c++ - 编译器优化如何加快简单操作之间的时间?

我有一个使用 SPI 的嵌入式 C++ 项目。当我编译并运行我的程序而不进行优化 (-O0) 时,外围设备(LCD 面板)工作正常。当我使用优化 (-O1) 编译它时,外围设备无法正常工作。

我用逻辑分析仪检查了这两种情况,唯一的区别是写入字节之间的时间使用优化的代码要短得多(时钟速率、写入的字节数等是相同的)。编译器优化如何影响后续操作之间的时间,这些操作只是一个接一个地写入硬件寄存器?如果我在 SPI 类中的每个写入命令之后添加延迟,它在优化的情况下工作。

与下面的示例不同,在原始代码中,对WriteCommand()和的调用WriteData()是通过指针进行的。

代码片段,通过 SPI 连续写入外设:

SPI类:

这个类的实现是:

编辑- 从 SPI::Write() 中删除了 DelayInCycles()。没有它,差异仍然很明显,我无意将它包含在这篇文章中。

0 投票
1 回答
222 浏览

c - 斐波那契数列不正确

该程序应打印斐波那契数列的前 50 个数字。但只有前 47 个打印正确,后三个打印不正确。

输出是:

0 投票
2 回答
297 浏览

usb - 我的 USB 设备(微控制器)阻止 Windows 启动

我一直在为 NXP LPC1788 微控制器开发一个应用程序,该应用程序涉及使用 USB 与主机 PC 通信。

一般来说,该应用程序工作正常。但是,我注意到多台不同的计算机是,如果微控制器通电并连接到断电的计算机,然后计算机又打开,计算机将无法启动。拔下微控制器并尝试再次启动计算机将解决问题。

为什么微控制器会阻止计算机启动?我已经用谷歌搜索了这个问题,似乎这个问题发生在 Windows 试图将 USB 设备视为可启动时,而它不应该是。

有没有办法可以防止我的应用程序发生这种情况?我应该提供哪些信息来帮助其他人诊断问题?

如果它有用,下面是 micro 的设备描述符:

这是配置描述符:

编辑

字符串描述符(用下划线替换字母):

编辑 2

iManufacturer将,iProduct和分别更改iSerialNumber为 0x1、0x2 和 0x3 使得 USBLyzer 不会获取字符串描述符,这不是一个有希望的迹象。如果我使用原始索引值,它确实如此。我还没有检查这如何影响计算机的启动能力。

编辑 3

我注意到我的iSerialNumberiInterface参数是 2。0x30+0x14 = 0x44.

我会看看这是否解决了任何问题。

编辑 4

更正上面的两个参数后,我的问题似乎得到了解决。TurboJ 让我注意到索引值应该很小,例如 0x1、0x2、0x3...

NXP 似乎对如何做到这一点有不同的想法,我复制了他们的方式,但我认为我可以稍后修改代码,使其像其他 USB 设备一样工作。

0 投票
1 回答
1501 浏览

c - 接口问题 LPC1769 和 MPU6050

我正在尝试连接 LPC1769 和 MPU6050 我正在使用mcb1700.code.bundle.lpc1769.lpcxpresso库。我正在使用 LpcXpresso 作为 IDE。

正如我为读取序列编码的 MPU6050 数据表中所指定的,它仅在第一次工作,如果我尝试第二次读取,它返回零值。(即重置后它只工作一次)

我尝试了很多可能的方法,没有结果所以请给我一些解决方案来解决这个问题。

已编辑.. 我在下面显示的代码。read 和 burstRead 代码都只工作一次

i2cc

MPU6050功能

0 投票
1 回答
406 浏览

c - 如何编写通过UART0接收和发送的中断

我正在使用我的 uC LPC2478。我正在研究功能UART0。但我需要制作功能UART0。我不知道中断,如何使用!

我尝试发送一个长字符串,它应该接收一个长字符串。但它不起作用。但是我需要写函数__irq void isr_UART0 (void)???

0 投票
0 回答
376 浏览

c - 通过 uart0 LPC24xx 接收时如何发送一个字

有一个来自 KEIL 的代码示例。它工作正常。但我的问题是我需要在 LPC24xx 中接收时发送一个单词而不是一个字符。

这是示例:

在终端它显示:

需要改变什么,发送一个字符串?不仅仅是性格!

0 投票
1 回答
773 浏览

gdb - 在 OpenOCD 中配置辅助核心

我在使用 OpenOCD 编程和调试 LPC4357 微控制器时遇到问题。该芯片具有一个 Cortex M4 内核和一个辅助 Cortex M0 内核。这是我正在使用的 OpenOCD 配置:

尝试使用 GDB 的加载命令向内部闪存写入内容会出现以下错误:

现在我怀疑问题是 OpenOCD 认为它必须在写入闪存之前停止 M0 内核,而 M0 内核没有响应暂停请求。

原因是 M0 内核甚至没有运行,因此无法停止。它的复位和时钟信号由 M4 内核控制,它们仅在启动序列的后期启用。

有没有办法告诉 OpenOCD M0 内核在 M4 固件启用之前不可用?

0 投票
1 回答
1609 浏览

pdo - LPC11Cxx 的 CANopen PDO 示例代码

我使用 LPC11Cxx 演示测试并理解了 SDO rx 和 tx。但这个演示堆栈只有 SDO 函数和驱动程序API。我想为此实现 PDO。有哪些示例代码或实现步骤或功能?

我想定期从从节点向主节点发送 68(ADC 数据)字节的数据。我怎样才能做到这一点?

对于上述任务,SDO 是否优于 PDO?我需要多少个 PDO 才能发送 64 字节的数据?如何设置 PDO 映射和参数?主节点和从节点有什么区别?我如何区分代码?