- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们使用的是 Micrium 的 uC/OS-III 实时操作系统。我们正在尝试在 RTOS 上返回 malloc 的值。当我们在 RTOS 启动之前执行 99999 的 malloc(对于 RAM 来说太多)时,我们得到一个空指针,这正是我们所期望的。
当我们在 RTOS 启动时和在任务中执行相同的 malloc 时,我们没有得到空指针,这是我们不希望的。不过,此时系统确实卡住了。
有人对此有解释吗?
提前致谢
编辑:
信息:我们使用的是 Renesas 的 RX62N 微 Controller 和 GNURX 编译器
程序实际上并没有卡住。该程序“认为”它获得了一个有用的指针(不是 NULL 指针),并继续运行。在某一时刻,程序将其程序计数器更改为 00000000 并停止。所以它不会进入异常,因此我们无法捕获它。
然而,在 RTOS 启动之前和 RTOS 启动时调用 malloc 时会有所不同。不同之处在于 malloc 的真正深层汇编代码。
在某一点执行以下指令
CMP R1,R7
BGTU.B 0FFF802C0H
ADD R14,R7
当我们尝试分配过多的 RAM 时,BGTU.B 指令不应分支,然后程序会继续执行 ADD 指令。这在启动 RTOS 之前执行 malloc 时非常有效,但在我们之后执行时失败。
These are the values I get in several cases
Outside RTOS (allocable number: 10)
R1: 00008348
R7: 00000014
Outside RTOS (not allocable number: 9999)
R1: 00008348
R7: 00002718
Inside RTOS (allocable number: 10)
R1: FFFFF9D0
R7: 00000014
Inside RTOS (not allocable number: 9999)
R1: FFFFF9D0
R7: 00002718
我希望整个情况都清楚,我已尽力解释清楚 :P
提前致谢
最佳答案
除了示例中的第二种情况,R7 似乎都包含分配的大小(请求的大小 + 对齐方式 + 堆管理数据)。直觉上 R7=0x2718 对应于 999 字节的分配,所以我怀疑这可能是一个错字。
我猜 R1 包含将分配内存的堆 block 的大小,从那时起 CMP 就有意义了。如果 block 不够大,它将失败。
但是当RTOS运行时,R1中的值变得很大,显然是不正确的。如果您的堆已损坏,则可能会发生这种情况。如果您溢出分配在堆上的缓冲区,就会发生这种情况。如果您从堆中分配线程堆栈,并且堆栈太小,也会产生同样的效果。您的线程堆栈必须足够大以应对最坏情况下的调用堆栈,以及 RTOS 支持上下文切换所需的任何内容。即使您没有从堆中分配堆栈,如果线程堆栈与堆内存相邻,堆栈溢出也可能产生相同的效果。
堆可能被破坏的另一种方式是在多个线程中同时执行分配或释放而不强制互斥或临界区。标准库堆管理不太可能是线程安全的,除非您进行了必要的修改以将其与您的 RTOS 集成 - 如果 RTOS 和标准库来自同一供应商(例如,如果两者都提供与编译器)。
关于c - Micrium 的 uC/OS-III RTOS 中的 Malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10600942/
假设有 6 个任务,在 6 个中,有 4 个(任务)正在等待一个信号量。当信号量发出信号时, 会做出什么决定?实时操作系统 which tasks to pick from the waiting(f
我希望编写一个非常基本的 RTOS,它可以在两个任务之间切换。它不适合任何专业用途。只是为了好玩 大多数引用资料都是关于如何使用 RTOS,而不是如何编写 RTOS。 引用像 FreeRTOS 这样的
如果有人可以解释 RTOS 中的滴答率过高的影响,或者指导我找到清楚解释它的资源,我将不胜感激? 问题的上下文... 我们使用 ucos-ii 运行,滴答率为 10000 (OS_TICKS_PER_
Zephyr 实时操作系统 https://www.zephyrproject.org/是一个 Linux 基金会项目。 Linux 以其 GPL 许可证而闻名。那么为什么 Zephyr RTOS 使
假设有两个任务正在运行TASK_A和TASK_B。当TASK_A运行时,发生中断,需要将上下文切换到TASK_B。 在ISR内时,不应直接跳过TASK_B,因为它仍在ISR中并且尚未返回(例如:未执行
我想了解操作系统节拍时间是什么意思,它有什么用? 以及它与 CPU 节拍率有何不同 最佳答案 系统节拍是操作系统计时器和延迟所基于的时间单位。系统节拍是一个调度事件 - 即它会导致调度程序运行并可能导
我正在尝试从头开始学习 RTOS,为此,我使用 freeRTOS.org 作为引用。我发现这个站点是学习 RTOS 的最佳资源。但是,我有一些疑问,我试图找出答案,但无法得到确切的答案。 1) 如何找
在基于 ARM7 的 C 语言编程的嵌入式应用程序中(具有可移植性要求),当前使用基于商业优先级的抢占式 RTOS,我们需要根据客户要求删除该 RTOS 和任何 RTOS 依赖项。我们有 8 个任务使
我对嵌入式世界还很陌生。我在为基于 ARM M0+ 的飞思卡尔微处理器编码固件方面有一些经验。我目前正在使用 CML-5282 开发板 (M5282LITE) 进行一个新项目,它带有 RTXC Qua
首先是背景,我的问题的细节如下: 在我工作的公司,我们工作的平台目前是 Microchip PIC32 系列,使用 MPLAB IDE 作为我们的开发环境。以前,我们还为同一应用编写了 Microch
FreeRTOS 使用什么样的调度程序? 我在某处读到它是一个运行完成调度程序,但另一方面,我也看到它与并行任务一起使用,所以它不会是一个循环调度程序? 最佳答案 最高优先级的任务被授予CPU时间。如
我正在对 TI 的一 block 板进行编程,并且我希望能够以某种方式将两个不同的 ISR 发布到任务的消息队列中。那部分工作正常。但是,在接收端,是否有任何智能方法可以让任务挂起在队列中,并根据发布
FreeRTOS 使用什么样的调度程序? 我在某处读到它是一个运行完成调度程序,但另一方面,我也看到它与并行任务一起使用,所以它不会是一个循环调度程序? 最佳答案 最高优先级的任务被授予CPU时间。如
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在编写一个模块,其中包含一个具有最高优先级的任务,并且它应该处于阻塞状态,直到它收到来自其他任务的消息,开始履行其作为最高优先级任务的职责。它使用邮箱机制进行信令。 我的问题是我希望任务 - 向更
所以我对为我实现的游戏形成线程的最佳方法有点困惑。游戏非常简单,你必须操纵你的飞船来躲避来袭的墙壁。 目前我的代码只是循环执行,直到宇宙飞船爆炸。以此 while 循环表示(如果游戏结束,notBlo
我对创建任务的 RTOS 方法不熟悉。之前,我在 Raspberry Pi 上使用 pthread,这使我能够同时运行 2 个任务, 1)每2秒通过套接字发送数据 2)每当从客户端发送数据时,通过套接
简单背景: 在我的 MCU 上运行 freeRTOS。 我的项目中的功能之一是一个处理存储在外部存储器中的参数的库。 基本上在启动时,主函数调用从外部存储器读取所有参数并将它们存储在库内的静态变量(非
我想编写一个需要一些 RTOS API(例如 Mbox 和任务创建 API)的模块! 我正在尝试使用结构化代码并为此查看一些库,例如“lwip”。在“lwip”中有一个名为 Sys-arch.c 的文
我有一个现有的嵌入式源代码,它直接在没有操作系统的微 Controller 上运行。我需要移植代码以在特定的 RTOS 上运行。 在尝试做某事时,是否有关于从哪里开始的指导方针?资源、最佳实践和其他见
我是一名优秀的程序员,十分优秀!