标签: rtems

为什么通过缓存c ++访问静态ram会有明显的速度下降?

背景

我一直在研究可能使用MPC5200静态RAM空间作为便笺式存储器.我们有16Kb未使用的内存出现在处理器总线()上.

现在一些重要的实施说明是:

  1. 这个存储器由BestComm DMA控制器使用,在RTEMS此基本上将在SRAM的开始处设置一个任务表,其中包含一组16个任务,可以作为外设接口,I2C,以太网等的缓冲区运行.为了使用这个空间没有冲突并且知道我们的系统只使用大约2Kb的以太网驱动程序缓冲区,我将SRAM的起始偏移了8Kb,所以现在我们知道8Kb的内存不会被系统使用.

  2. RTEMS 定义一个指向静态内存的数组,如下所示:

(来源)

typedef struct {
    ...
    ...
    volatile uint8_t    sram[0x4000];
 } mpc5200_t;

 extern volatile mpc5200_t mpc5200;
Run Code Online (Sandbox Code Playgroud)

我知道sram数组指向静态内存,因为当我编辑第一部分并打印出内存块(MBAR + 0x8000 源代码)时

所以从这里我可以说以下,我有RTEMS定义访问SRAM通道mpc5200.sram[0 -> 0x2000].这意味着我可以开始对我可以摆脱它的速度进行一些测试.


测试

为了评估速度,我设置了以下测试:

int a; // Global that is separate from the test. 

**TEST**

// Set up the data.
const unsigned int listSize = 0x1000;
uint8_t data1[listSize];
for (int k = 0; k < …
Run Code Online (Sandbox Code Playgroud)

c++ powerpc rtems

15
推荐指数
1
解决办法
323
查看次数

开源交叉编译器支持Ada多任务RTOS

Ada有哪些RTOS可以使用开源/免费交叉编译器,支持多任务/多线程?

我有一个Atmel AT90USB162芯片,我想用Ada编程.我的第一个选择是使用AVR-Ada对其进行编程,但由于它没有任务支持,因此它是不可选择的(现在我对如何支持其任务转移没有任何线索).所以我需要一个更强大的方法.我想过使用QNX,但它比我的芯片架还要复杂得多.

我得到了AVR芯片支持uC/OS-II和FreeRTOS的信息.FreeRTOS或uC/OS-II有免费的Ada交叉编译器吗?

谢谢.

avr rtos ada cross-compiling rtems

9
推荐指数
3
解决办法
2308
查看次数

只有一个变量名的语句在C中输入(void)

在RTEMS初始化例程中,我看到下面的代码.

void boot_card(const char *cmdline)
{
  rtems_interrupt_level  bsp_isr_level;

  /*
   * Special case for PowerPC: The interrupt disable mask is stored in SPRG0.
   * It must be valid before we can use rtems_interrupt_disable().
   */
  #ifdef PPC_INTERRUPT_DISABLE_MASK_DEFAULT
    ppc_interrupt_set_disable_mask( PPC_INTERRUPT_DISABLE_MASK_DEFAULT );
  #endif /* PPC_INTERRUPT_DISABLE_MASK_DEFAULT */

  /*
   *  Make sure interrupts are disabled.
   */
  (void) bsp_isr_level;      // <--- 
  rtems_interrupt_disable( bsp_isr_level );
  -- continues--
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,在开头,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中)

rtems_interrupt_level rtems_interrupt_disable( void )
{       
  rtems_interrupt_level previous_level;

  _ISR_Disable( previous_level …
Run Code Online (Sandbox Code Playgroud)

c rtems

7
推荐指数
1
解决办法
125
查看次数

为以太网适配器设置自定义IP时无法绑定套接字

问题

在我们运行RTEMS 4.9.2的系统上,我们遇到了一个非常奇怪的套接字通信问题.我们正在设置套接字并使用以下命令进行绑定:

// Bind the socket to set the local port
sockaddr_in localSocketAddress = {0};
localSocketAddress.sin_family = AF_INET;
localSocketAddress.sin_port = (u_short)localPort;
localSocketAddress.sin_addr.s_addr = localAddress;

if (bind( mSocket, (sockaddr *)&localSocketAddress, sizeof(sockaddr_in)) == SOCKET_ERROR)
{
    int errorOut = errno;
    ...
Run Code Online (Sandbox Code Playgroud)

这适用于UDP通信,除了下面解释的奇怪的特定场景.bind即使设置正确,我们遇到的问题是此调用失败.我们得到125RTEMS 的错误EADDRNOTAVAIL:

请求了一个不存在的接口,或者请求的地址不是本地的.

表观原因

在设备启动时,我们可以通过以下两种方式之一设置我们的网络:

  1. 网络IP和SUBNET基于默认引导加载程序(UBOOT)中的内容进行自动配置,并通过RTEMS OS进行设置.

  2. rtems_bsdnet_ifconfig调用RTEMS函数以在引导时间后更改唯一以太网接口的IP地址.

为了澄清,选项2的调用方式如下:

rtems_bsdnet_ifconfig(eth_interface, SIOCSIFADDR, &ipaddr);
Run Code Online (Sandbox Code Playgroud)

如果按照选项1的指示设置网络,则一切都按预期工作,但如果使用选项2(即使在设置与选项1定义的网络选项匹配的情况下),则套接字绑定失败.

RTEMS是否存在已知原因或错误,表明如果重新配置IP,此绑定将失败?

附加信息

  • 我们正在使用主要使用的方法设置新的IP地址(选项2)ioctl("eht1", SIOCSIFADDR, ...).

  • 如果我们绑定我们的套接字而不指定本地ADDRESS(即使用INADDR_ANY)那么它在任何情况下都可以工作.

  • rtems_bsdnet_ifconfig是一个简单的ioctl功能接口.它来自rtems_glue.c并具有功能标志int rtems_bsdnet_ifconfig(const char *ifname, …

c c++ sockets networking rtems

6
推荐指数
1
解决办法
692
查看次数

如何获取库函数的内存位置?

我正在使用 SPARC RTEMS C 编译器编译 C 程序。

使用 Xlinker -M 选项,我可以获得包含很多我不认识的东西的大内存映射。

我也尝试过使用 RCC nm 实用程序,它返回一个更易读的符号表。我假设此实用程序为 printf 给出的位置是 printf 在内存中的位置,并且每个调用 printf 的程序都将在执行期间到达该位置。这是一个有效的假设吗?

有没有办法获得所有库/系统功能的位置列表?另外,当链接完成时,它是只链接可执行文件调用的函数,还是链接库中的所有函数?考虑到我在符号表和内存映射中找到的东西的数量,在我看来似乎是后者。我可以让它只链接所需的功能吗?

谢谢你的帮助。

c linker memory-management sparc rtems

2
推荐指数
1
解决办法
2762
查看次数

标签 统计

rtems ×5

c ×3

c++ ×2

ada ×1

avr ×1

cross-compiling ×1

linker ×1

memory-management ×1

networking ×1

powerpc ×1

rtos ×1

sockets ×1

sparc ×1