问题标签 [rtems]
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.
function - 为 RTEMS 挂接我自己的文件系统函数
我正在为 RTEMS 操作系统开发文件系统。我的问题是如何将 unistd.h 库中的 opendir、readdir 和 closedir 函数重定向到我自己的文件系统的 opendir、readdir 和 closedir 函数?即如何将它们连接到 RTEMS?
谢谢,
linux - RTEMS:如何编译和执行程序?
我刚刚开始了我的学术项目:纳米卫星软件基础设施。我在 CentOS 上安装了 RTEMS,我可以编译和执行示例程序,比如 hello 或ticker。当我对现有文件(例如 init.c)进行任何更改添加新文件、任务或函数时,编译失败。我没有找到任何教程,如分步说明如何从头开始创建一个新程序并编译它,只有关于如何编译现有示例文件并运行它们的示例......有人可以在这一点上提供帮助吗?
gdb - 如何使用 gdb 检查 RTEMS 应用程序的堆和堆栈?
有没有办法通过使用 gdb 准确地知道 RTEMS 应用程序上的堆和堆栈的地址范围?我知道info proc mappings
Linux 上有,但我认为 RTEMS 没有 /proc 开头。用来x
检查内存会很好,但我需要知道两者的地址范围。
我知道http://www.rtems.org/wiki/index.php/Debugging中有一些提示,但他们自己承认这些确实是粗略的估计。
c - 构建 RTEMS 时出现“PTHREAD_RWLOCK_INITIALIZER undeclared”错误
构建RTEMS-4.11时出现错误,在源文件“posix/src/prwlockinit.c”中使用了配置参数“--enable-posix”
日志显示“cpukit/posix/src/prwlockinit.c:42:19: error: 'PTHREAD_RWLOCK_INITIALIZER' undeclared (first use in this function)”
当我在 rtems 源目录中使用 shell 命令:grep -r "PTHREAD_RWLOCK_INITIALIZER" 时,我对声明的这个宏一无所知。
我如何用“--enable-posix”而不是“--disable-posix”来解决这个问题?
c++ - 导致程序中的段错误不会被信号处理程序捕获
首先我要指出这里的操作系统是 RTEMS,它是一个开源 RTOS,源代码可以在这里找到:
我有一个非常简单的程序,它使用此处文档中的 sigaction 调用为 SIGSEGV(我相信它是受支持的)设置信号处理程序:
http://docs.rtems.org/releases/rtemsdocs-4.9.2/share/rtems/html/posix_users/posix_users00033.html
我的程序基本上可以归结为:
但是,问题是当我在程序中导致段错误时,不会调用信号处理程序,而是调用内核进程vectors_init.c
(RTEMS 源)来打印堆栈跟踪。为了在我的 rtems 程序中获取 SIGSEGV 信号,我需要做一些特别的事情吗?
debugging - 为什么在我请求写入后 gdb 会自动执行读取?
我正在使用 gdb 通过自制的 gdb 服务器与基于 LEON2 的 ASIC 进行通信(不确定“gdb 服务器”是否是正确的短语)。它的工作原理是这样的:gdb 客户端使用普通的 gdb 协议与 gdb 服务器通信,然后 gdb 服务器将 gdb 请求转换为从/向硬件读取和写入,并将结果发送回客户端(如果有)。我的 gdb 客户端是 Windows 7 PC 上 RTEMS 4.8.0 中的 sparc-rtems-gdb 6.6。
当我启动 gdb 客户端时,我运行以下命令来附加到 gdb 服务器:
然后我想改变 RAM 中的一个单词,所以我运行这个 gdb 命令:
在调试 gdb 服务器时,我可以看到它收到以下行,根据 gdb 协议,这是预期的并且是正确的,即将 4 个字节,值 2 写入地址 0x40000000:
现在的困惑:在上面的写请求之后,另一个请求来自gdb客户端,从地址0xABD37787读取4个字节:
为什么 gdb 客户端试图从该地址读取?据我所知,我没有做任何事情来请求这个读取,我只想执行写入。如果 gdb 会读回地址 0x40000000,例如为了验证写入,就可以了。但是我的硬件上不存在无处不在的地址 0xABD37787,这给我带来了问题。
有什么方法可以调试 gdb 客户端以确定它正在发送和接收什么(以及为什么)?或者 gdb 中是否有可以解释这种行为的设置?
此致
亨里克
c++ - 使用 RTEMS 操作系统的具有 cpu 时间的时间短函数
我希望在实时操作系统中分析一些代码,RTEMS
. 本质上,rtems 有一堆函数可以读取时间,其中最有用的是rtems_clock_get_ticks_since_boot
.
这里的问题是,无论出于何种原因,报告的时钟滴答与我们的状态机循环速率同步,5kHz
而处理器运行在大约200MHz
(嵌入式系统)。我知道这一点,因为我记录了时钟时间,等了 1 秒,只有 5000 个滴答声过去了。
所以问题是:
如何从 RTEMS 获取实际的 CPU 滴答声?
PS。
clock()
来自 GNU C(有同样的问题)
有一个我一直在研究的指南,但我得到impossible constraint in asm
这表明我需要使用一些不同的汇编器关键字。也许有人可以指出我类似的东西?
语境
我想分析一些代码,所以本质上是:
代码在不到 0.125 毫秒内运行,因此clock()
和其他 rtems 函数获得的 8khz 计数器不会削减它。
c++ - 为什么通过缓存 C++ 访问静态 ram 的速度会急剧下降?
背景
我一直在研究可能将MPC5200静态 ram 空间用作暂存器内存。我们有 16Kb 的未使用内存出现在处理器总线(源)上。
现在一些重要的实现说明是:
该内存由BestComm DMA控制器使用,在
RTEMS
此之下将在 SRAM 的开头设置一个任务表,其中包含一组 16 个任务,可以作为外围接口、I2C、以太网等的缓冲区运行。为了使用这个空间没有冲突并且知道我们的系统只使用了大约 2Kb 的以太网驱动程序缓冲区,我将 SRAM 的开始偏移了 8Kb,所以现在我们有 8Kb 的内存,我们知道系统不会使用它。RTEMS
定义一个指向静态内存的数组,如下所示:
(来源)
而且我知道 sram 数组指向静态内存,因为当我编辑第一部分并打印出内存块(MBAR + 0x8000
源)时
所以从这里我可以说以下内容,我有 RTEMS 定义的对SRAM
via的访问mpc5200.sram[0 -> 0x2000]
。这意味着我可以开始对我可以摆脱它的速度进行一些测试。
测试
为了评估速度,我设置了以下测试:
非常简单,概念是我们正在迭代可用空间并设置全局。我们应该期望静态内存应该有相同的近似时间。
结果
所以我们得到以下信息:
所以这里发生了一些事情,因为静态几乎比缓存慢 6 倍。
假设
所以我对为什么会这样有 3 个想法:
- 缓存未命中,我想也许是因为我们正在混合动态和静态 ram,所以发生了一些奇怪的事情。所以我尝试了这个测试:
.
我们有以下结果:
所以现在它慢了 200 倍?所以我想这与此无关?
与正常不同的静态内存,我想到的下一件事是,由于这条线,它可能不会像我想象的那样交互:
MPC5200 包含 16KBytes 的片上 SRAM。BestComm DMA 单元可以直接访问该内存。它主要用作任务表和缓冲区描述符的存储,BestComm DMA 使用它来将外设数据移入和移出 SDRAM 或其他位置。这些描述符必须在启动时下载到 SRAM。该 SRAM 位于 MPC5200 内部寄存器空间中,也可由处理器内核访问。因此,它可以用于其他目的,例如便签本存储。16kBytes SRAM 从位置 MBAR + 0x8000 开始。
(来源)
我不确定如何确认或否认这一点?
- 较慢的静态时钟,也许静态内存运行在较慢的时钟上,就像在某些系统中一样?
这可以通过查看手册来反驳:
(来源)
SRAM 和处理器在同一个时钟上,XLB_CLK
以处理器基频运行(来源)
问题
什么可能导致这种情况,一般有理由不使用 SRAM 进行暂存器存储吗?我知道在现代处理器上这甚至不会被考虑,但这是一个较旧的嵌入式处理器,我们正在为速度和空间而奋斗。
额外测试
所以在下面的评论之后,我进行了一些额外的测试:
- 添加
volatile
到堆栈成员以查看速度是否更相等:
.
所以仍然快得多,并且与volatile没有任何变化??
- 反汇编代码看看发生了什么
.
我不是特别擅长互穿汇编程序,但也许我们这里有问题?从全局访问和设置内存似乎需要更多的指令SRAM
?
- 从上面的测试看来,指针的指令较少,所以我添加了这个:
.
我得到以下结果:
所以指针需要更长的时间!我会认为它会完全一样?这只是越来越陌生。
c - 仅在 C 中转换为 (void) 的变量名的语句
在 RTEMS 初始化例程中,我在下面看到这段代码。
在上面的代码中,一开始,bsp_isr_level 被声明为 rtems_interrupt_level 类型(最终类型定义为 unsigned int)。
但是,这条线(void) bsp_isr_level;
在做什么?(上面标有 //<-- )。它不是像这里那样作为函数参数传入的变量。
编辑:我发现在我的情况下,该变量是由 rtems_interrupt_disable 函数分配的(实际上它是一个宏#defined),所以它不是“未使用”。但是尽管分配了,分配的值似乎没有被使用。我不知道这种语法是否也用于这种情况(赋值但未使用)。顺便说一句,我在 RTEMS 源代码树中发现了一个函数(真正的函数,不是#defined)rtems_interrupt_disable,它具有如下所示的 void 参数。(在 cpukit/rtems/src/intrbody.c 中)。(#defined 版本在 cpukit/rtems/include/rtems/rtems/intr.h 中)
所以也许这个语法可能已经被使用,以防第二个定义(值作为 void 传递给函数)。我猜是因为存在第二个定义,所以可以在某些构建案例中使用。
c++ - 重命名 RTEMS 的 errno 失败
我正在使用重命名函数RTEMS
来尝试重命名文件。当我发现它RTEMS
似乎不符合它自己的errno报告指南时,我正在建立一个正确的错误处理和报告系统。
所以失败的函数总是返回-1。当前示例位于</D\>
我具有以下内容的目录中:
我打电话给rename("LALALA_1", "LALALA_2")
它工作正常,文件夹被重命名。所以我知道这个功能有效。如果我打电话rename("LALALA", "LALALA_2")
,它无法返回 -1... 这很好,但EEXIST
我得到的不是errno == -1
.