我一直在研究可能使用MPC5200静态RAM空间作为便笺式存储器.我们有16Kb未使用的内存出现在处理器总线(源)上.
现在一些重要的实施说明是:
这个存储器由BestComm DMA控制器使用,在RTEMS此基本上将在SRAM的开始处设置一个任务表,其中包含一组16个任务,可以作为外设接口,I2C,以太网等的缓冲区运行.为了使用这个空间没有冲突并且知道我们的系统只使用大约2Kb的以太网驱动程序缓冲区,我将SRAM的起始偏移了8Kb,所以现在我们知道8Kb的内存不会被系统使用.
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) Ada有哪些RTOS可以使用开源/免费交叉编译器,支持多任务/多线程?
我有一个Atmel AT90USB162芯片,我想用Ada编程.我的第一个选择是使用AVR-Ada对其进行编程,但由于它没有任务支持,因此它是不可选择的(现在我对如何支持其任务转移没有任何线索).所以我需要一个更强大的方法.我想过使用QNX,但它比我的芯片架还要复杂得多.
我得到了AVR芯片支持uC/OS-II和FreeRTOS的信息.FreeRTOS或uC/OS-II有免费的Ada交叉编译器吗?
谢谢.
在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) 在我们运行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:
请求了一个不存在的接口,或者请求的地址不是本地的.
在设备启动时,我们可以通过以下两种方式之一设置我们的网络:
网络IP和SUBNET基于默认引导加载程序(UBOOT)中的内容进行自动配置,并通过RTEMS OS进行设置.
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, …
我正在使用 SPARC RTEMS C 编译器编译 C 程序。
使用 Xlinker -M 选项,我可以获得包含很多我不认识的东西的大内存映射。
我也尝试过使用 RCC nm 实用程序,它返回一个更易读的符号表。我假设此实用程序为 printf 给出的位置是 printf 在内存中的位置,并且每个调用 printf 的程序都将在执行期间到达该位置。这是一个有效的假设吗?
有没有办法获得所有库/系统功能的位置列表?另外,当链接完成时,它是只链接可执行文件调用的函数,还是链接库中的所有函数?考虑到我在符号表和内存映射中找到的东西的数量,在我看来似乎是后者。我可以让它只链接所需的功能吗?
谢谢你的帮助。