问题标签 [micrium]
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.
c++ - Micrium OS -III 定时器回调函数没有被调用
我正在为 arm(stm32F4) 使用 keil 编译器。在我的代码中,我创建了一个计时器来调用从 *.lib 文件调用函数的函数。
如果我使用链接器优化级别 0 (O-0) 并且应用程序工作正常,则会调用该函数。如果我将优化级别更改为 (O-1),则该函数不会包含在可执行文件中。
我检查了监视窗口中的计时器结构,计数器值正在更新,并且存在与映射文件中的地址匹配的回调函数地址。
从 keil 帮助中我了解到,在 Level 1-o1 优化中完成了以下优化。
- 不能在死代码上设置断点。
变量的值在初始化后可能在其范围内不可用。例如,如果他们分配的位置
已被重复使用。- 没有副作用的函数可能会被乱序调用,或者如果不需要结果则可能被省略。
我尝试从任务中调用 lib 函数。但同样的事情仍在发生。由于该函数是直接引用的,我怀疑编译器认为该函数没有副作用。
我该如何解决这个问题?
创建计时器的代码。
启动周期性计时器的代码。
编译器控制字符串。
semaphore - ISR 中的 UC/OS III 信号量有时不起作用
我的信号量有问题,有时在 ISR 中调用的 SemPost 似乎无效。
我的应用程序基于 Micrimum UCOS III,目标平台基于 Microsemi Smartfusion2 SoC (Cortex-M3)。我的应用程序包含两个任务(A 和 B),但是当问题发生时只有一个处于活动状态(另一个被卡在信号量上)。
当活动任务(我们称之为任务 A)执行以下操作时会出现问题:
- 写入某个寄存器以在触发中断后开始操作
- 等待操作完成在 semafore 上创建 OSSemPend(我们称之为 Sem A),将超时设置为 100 毫秒。
- 检查 OSSemPend 调用是否正常结束或是否发生超时
当中断被触发时,相关的 ISR 在 Sem A 上进行 SemPost,以便在超时之前解锁信号量。
当问题发生时,OSSemPend 返回 OS_ERR_TIMEOUT。我很少看到这个问题。
我确定:
- 给出启动操作(见第 1 点)并开始操作。
- 触发中断并执行 Sem A 上的 OSSemPost。
- 从开始到 500 微秒(即 < 1 毫秒)后触发中断
代码是否正确编写?在 ISR 中使用信号量是否有任何限制?有人能帮我吗?谢谢
我附上了代码的简化版本
c - uC/OS-III Systick & Peripheral timer0 用于 PWM 干扰
我无法在运行 uC/OS-III 的 NXP LPC1857 上获得 LED 的 PWM 信号平稳运行。只有当我禁用以 1ms 运行的操作系统系统时,经常发生的闪烁才会停止。
我已经用 4 个匹配寄存器设置了我的计时器,一个用于每种颜色(红色、绿色、蓝色),一个用于整个周期。前三个匹配输出正在清除每种颜色的物理输出引脚。最后一个周期匹配产生一个中断来设置下一个周期的所有三种颜色输出。
我试图通过在中断周围添加以下代码来在 timer0 中断期间禁用来自操作系统的中断:
有谁知道为什么 systick 会导致 PWM 信号闪烁?
micrium - 如何绑定到 Micrium 中的广播地址
我正在尝试找到一种将 IPv4 UDP 套接字绑定到 Micrium (µC/OS-Ⅲ) 中的广播地址的方法。
尝试将套接字绑定到实际广播地址只会返回NET_SOCK_ERR_INVALID_ADDR
。广播没有在呼叫文档上的绑定列表中明确提及NetSock_Bind
,也没有类似的内容SO_BROADCAST
。这根本不可能吗?
作为最后的手段,我是否可以将广播地址添加到现有接口作为其自己的地址(这不应该弄乱 ARP,因为没有人会要求它,我也不会通过它发送任何东西) ?
c - 找出特定地址上的对象是否是指针
我有一个 PC 程序通过 TCP/IP 连接与嵌入式板(英飞凌 XE169(C166 系列))进行通信。
该 PC 程序请求将哪些数据存储在某个地址上。PC 程序是 uC/Probe,我无法更改该程序的工作方式。
例如 uC/Probe 发送此消息:
这是一条从地址 0x613EDC 请求数据并从那里读取 4 个字节的消息。
在查看 .map 文件时,我可以看到在这个位置放置了 OSTCBCurPtr 变量。这个变量是一个 OS_TCB* 因此在请求的地址是这个变量指向的地址。
我现在已经在 .map 文件中手动查看了地址上放置了什么样的变量。但是我可以通过嵌入式板上的 C 代码获得变量类型吗?我只想知道位于该特定位置的对象是否是指针,它是 uint16_t、uint8_t、char 还是对我来说不重要的东西。
背景资料,为什么我想知道这个
嵌入式板将请求的数据发送回 uC/Probe 程序。但是指针以一种奇怪的方式存储在 XE169 芯片中。上面示例的指针例如是这样存储的:
因为该值是小端存储的,这将导致数字 0x01841FE6。该号码目前正在发送回 uC/Probe。但是他的号码不是正确的位置,必须进行一些计算才能到达实际的地址位置。
我们必须把这个 32 位的数字拆开,分成 2 个 16 位的数字。然后我们得到:
现在高 16 位必须向右移动 2 位。这些高 16 位的 2 个最低有效位成为低 16 位的 2 个最高有效位。
这导致:
当我们将这 2 个 16 位数字粘贴回 32 位数字时,我们有指针指向的地址:0x00611FE6
这是我必须发送回 uC/Probe 的号码。这种计算只需要在 uC/Probe 请求指针时进行,对于非指针,它只需要发回从给定地址读取的数据。这就是为什么我需要知道请求的数据是否是指针,希望有人可以帮助我。
c - CCES 调试器中 IID 0x7ffffff 错误的来源是什么,以及如何正确修复它?
我在 ADSP-SC584 上的 MDMA 传输有问题。我在 CCES IDE 2.8.3 工作
我以 MDMA CrossCore 示例项目为例,对数据流的 ARM 方向进行了更改。所以初始化是一样的(MCAPI地址和中断的SID)。
我有一个复杂的问题:
当我使用 ICE-1000 运行调试项目,并使用 MDMA 运行 DSP 内核发送数据时,ARM 内核不会触发。但是当我逐步执行 MDMA 发送 ARM 内核触发器时,我可以在 DDR ARM 区域缓冲区等中看到数据
当我最终运行两个内核时,我得到了ard fault错误
未注册处理程序时引发 ID (IID) 0x7fffffff 的启用中断。
在 DSP 项目中打开 MDMA:
在 ARM 从站上安装中断:
我可以看到 MCAPI 向我发送了正确的中断 SID(带有 ARM 的偏移量)
使用 RTOS 在 ARM 上回调:
我需要通过 UDP 将从 DSP 获得的数据发送到 PC。UDP 发送独立工作,DMA 传输独立工作,但在一起我总是得到 0x7fffffff IID 错误。
embedded - Micrium uC/FS 文件系统挂载延迟
我正在使用 spi 在 Nor flash 上开发 uC/FS Fat16 文件系统。卷挂载需要 3 分钟,即使在初始(第一次)挂载之后,每次开机挂载也需要 3 分钟。如何减少这个时间。
file - Micrium 文件系统分区问题
我已将 NOR Flash 划分为两个区域,并尝试将这两个区域安装到单独的卷中。但我得到了错误
FS_FAT_VolOpen(): Invalid boot sec sig: 0xFFFF != 0xAA55.
我已按照步骤
打开设备
FSDev_Open("nor:0:", (void *)&nor_cfg, &err);
创建了分区
(闪存大小为 8Mb)
验证分区是否已创建或未使用
它返回为 2。
- 尝试使用格式化区域
错误返回为“FS_ERR_PARTITION_NOT_FOUND”:
我得到的错误是
FSPartition_RdEntry(): Invalid partition sig: 0xFFFF != 0xAA55.
stack - 计算 RTOS 应用程序中的堆栈使用情况
我目前正在开发一个使用 RTOS (micrium) 在 STM32 微控制器中开发应用程序的项目。
是否有任何工具可以计算 RTOS 应用程序中特定线程的堆栈使用情况?