标签: embedded-linux

Linux总可用内存

我正试图找出一个很好的公式来找出可用的内存量.我目前使用以下公式:freeMem = MemFree + Buffers + Cached - Shmem.但是,根据这个公式,我的嵌入式系统正在失去记忆.现在我想知道我是否有内存泄漏所以我kmemleak在内核中启用了.据mpatrol,valgrindcoverity我没有在用户空间中的任何泄漏.内核空间是否有泄漏或我的配方是否关闭?请注意,我没有任何交换此设备.

MYBOX> cat /proc/meminfo
MemTotal:        2073348 kB
MemFree:         1388180 kB
Buffers:          137016 kB
Cached:            88772 kB
SwapCached:            0 kB
Active:           589124 kB
Inactive:          44380 kB
Active(anon):     410236 kB
Inactive(anon):     1992 kB
Active(file):     178888 kB
Inactive(file):    42388 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:       1310716 kB
HighFree:         811828 kB
LowTotal:         762632 kB
LowFree:          576352 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty: …
Run Code Online (Sandbox Code Playgroud)

linux memory-leaks linux-kernel embedded-linux

9
推荐指数
1
解决办法
1万
查看次数

什么'低内存'在Linux中意味着什么

我是韩国人并且对"引导程序首先将自身复制到固定的高内存地址以释放操作系统的低内存"感到困惑.

我所知道的通过谷歌搜索发现的低内存是这是DOS系统中的第一个640K内存.这是否意味着所有的OS系统(如内核)进入低内存(640K)????

感谢您阅读本文.

linux embedded-linux

9
推荐指数
1
解决办法
4147
查看次数

什么是嵌入式系统?Mobile可以被视为嵌入式产品吗?

嵌入式系统的意思是什么?

如果我们制作的系统/机器或产品用于多种用途,那么我们可以将其视为嵌入式系统吗?或者只是一个专门用于特定任务的系统被视为嵌入式系统?PC /移动/笔记本电脑可以被视为嵌入式系统吗?

embedded embedded-linux

9
推荐指数
2
解决办法
2万
查看次数

将大量二进制数据从u-boot传递到linux内核

在imx50 ARM板上将大量数据(3 MB)从uboot传递到linux内核2.6.35.3有一些问题.内核设备驱动程序探测功能需要此数据,然后才能释放.首先uboot将数据从闪存加载到RAM,然后使用bootargs传递linux内核的物理地址.在内核中,我尝试使用arch/arm/kernel/setup.c文件中的reserve_resource()来保留一定量的内存:

--- a/arch/arm/kernel/setup.c   Tue Jul 17 11:22:39 2012 +0300
+++ b/arch/arm/kernel/setup.c   Fri Jul 20 14:17:16 2012 +0300

struct resource my_mem_res = {
    .name = "My_Region",
    .start = 0x77c00000,
    .end = 0x77ffffff,
    .flags = IORESOURCE_MEM | IORESOURCE_BUSY,
};

@@ -477,6 +479,10 @@
    kernel_code.end     = virt_to_phys(_etext - 1);
    kernel_data.start   = virt_to_phys(_data);
    kernel_data.end     = virt_to_phys(_end - 1);
+   my_mem_res.start    = mi->bank[i].start + mi->bank[i].size - 0x400000;
+   my_mem_res.end      = mi->bank[i].start + mi->bank[i].size - 1;

    for (i = 0; i < mi->nr_banks; i++) …
Run Code Online (Sandbox Code Playgroud)

memory arm linux-kernel embedded-linux u-boot

9
推荐指数
1
解决办法
2712
查看次数

如何在Linux板上检测GPIO的引脚变化

我在基于ARM的linux板(imx233 CPU)上使用3.12内核.我的目的是检测GPIO的引脚变化(1到0).

我可以不断调用下面的函数读取引脚值(在while(1)循环中)

int GPIO_read_value(int pin){
    int gpio_value = 0;
    char path[35] = {'\0'};
    FILE *fp;
    sprintf(path, "/sys/class/gpio/gpio%d/value", pin);
    if ((fp = fopen(path,"rb+")) == NULL){ //echo in > direction
         //error
    }

    fscanf(fp, "%d", &gpio_value);
    fclose(fp);
    return gpio_value;
}
Run Code Online (Sandbox Code Playgroud)

但它会给CPU带来太多负载.我不使用usleepnanosleep,因为引脚更改发生的时间很短,导致我错过了该事件.

据我所知,它是不可能使用的poll().有没有poll()类似的功能可以用来检测GPIO的引脚变化?

编辑:以防万一,如果我做错了什么,这是我的poll()用法没有检测到引脚更改

struct pollfd pollfds;
    int fd;
    int nread, result;
    pollfds.fd = open("/sys/class/gpio/gpio51/value", O_RDWR);
    int timeout = 20000;           /* Timeout in msec. */
    char buffer[128];

    if( pollfds.fd < 0 ){
        printf(" …
Run Code Online (Sandbox Code Playgroud)

c linux posix embedded-linux gpio

9
推荐指数
1
解决办法
6684
查看次数

具有快速启动功能的Raspberry Pi嵌入式编程

我是一名计算机工程师学生,我的新项目遇到问题:

  • 显示汽车信息等的小屏幕.一个reeeeeally简单的版本一个车载电脑的.

我的Raspberry pi已经用了1个月了,我无法找到解决我的主要问题的解决方案:一个简单的Linux发行版,具有真正快速启动和开发带图形界面的应用程序的可能性

我项目的主要进展是:

  • 我试过Arch Linux一段时间了.但是20秒的启动速度还不够快.我无法正常运行任何图形界面
  • 我试过Gamaral的RPi-Buildroot.这是一个非常好的buildroot版本,专为raspberry pi设计.3秒的启动真是太神奇了.但除了使用它的"交叉编译" 的" Hello,World " 之外,我无法获得任何其他功能.(Github上的RPi-BuildRoot链接)

我只需要指示我需要做些什么才能使其正常工作.如果我得到一个简单的用户界面,开始时间不到10秒,我可以认为我的项目完成了.

我认为RPi-BuildRoot是一个很棒的工具,我找不到它的方法......

谢谢!抱歉英语不好;)

linux linux-kernel embedded-linux buildroot raspberry-pi

9
推荐指数
1
解决办法
7626
查看次数

c中的"short int"和"short"有什么区别?

将变量声明为short int和short之间有什么区别?在gcc编译器中,short占用2个字节(用sizeof(short)检查),short int也给出2bytes的大小.两者是相同的是不同的?在这种情况下这些声明会有用吗?

提前致谢

c int gcc short embedded-linux

9
推荐指数
1
解决办法
4053
查看次数

Linux:如何为RAMFS/TMPFS启用就地执行(XIP)

我正在研究一个嵌入式系统,在这个系统中,该过程rootfs是在一个tmpfs分区中构建的init.在之后rootfs完成,它会做一个支点根,并开始设在产卵过程rootfs.

但它似乎XIP不适用于我们tmpfs,因此所有应用程序都被加载到ram两次(在tmpfs加载时再次加入ram).

这真的可以吗?

我在https://ez.analog.com/thread/45262找到了一个旧的讨论主题,它描述了我所看到的相同问题.

如何为位于内存中的文件系统实现XIP?

linux linux-kernel embedded-linux

9
推荐指数
1
解决办法
507
查看次数

块的MTD擦除块大小为零

精致的问题

如何从擦除块大小为零的MTD SRAM器件读取和写入文本信息?

笔记:

  1. 我正在使用23K256驱动程序
  2. 尝试使用MTD-Util工具失败,因为libmtd无法处理擦除块大小为零
  3. 尝试人为添加擦除块大小也失败了(见下文)
  4. 尝试使用echo >,并catmtdblock只产生垃圾

原创 我试图读取和写入连接到运行Linux的ARM处理器的SRAM芯片.我不在乎我是否像文件,串行设备或内存分区一样与SRAM接口.SRAM芯片的现有设备驱动程序将设备注册为MTD.我通过检查验证了这一点/proc/mtd:

~# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00020000 00000000 "spi1.0"
Run Code Online (Sandbox Code Playgroud)

我找到了一个使用MTD工具格式化MTD的教程.我遇到的问题是我无法与SRAM/MTD设备接口,因为所有用户空间MTD/UBI/JFF2工具在查看此设备时崩溃,IE:

~# mtdinfo
Count of MTD devices:           1
Floating point exception (core dumped)
Run Code Online (Sandbox Code Playgroud)

此异常似乎正在发生,因为所有MTD实用程序都使用libmtd.mtd_get_dev_info1libmtd中的函数除以擦除块大小,在我的例子中,擦除块大小为零.

mtd->eb_cnt = mtd->size / mtd->eb_size;
Run Code Online (Sandbox Code Playgroud)

即使该芯片具有MTD驱动器,我也不认为写周期是一个问题,这就是擦除块为零的原因.所以我的问题如下:

  1. 我应该修改驱动程序以给芯片一个擦除块大小,以便实用程序正常工作吗?如果是这样大小?
  2. 我应该修改libmtd忽略零擦除块大小?如果是这样我应该设置什么eb_cnt
  3. 有没有更好的方法来读取和写入MTD设备的数据?

补充说明:

  1. 在我的情况下,稳定性比最佳性能更重要
  2. 我试图做一个echo test > /dev/mtdblock0cat /dev/mtdblock0,得到了什么,但垃圾

更新10/20 在驱动程序中将擦除块大小更改为1(我希望将其更改为4000,但我不确定单位).MTD Utils不再抛出之前给出的异常.

~# mtdinfo
Count …
Run Code Online (Sandbox Code Playgroud)

embedded linux-device-driver embedded-linux

9
推荐指数
1
解决办法
514
查看次数

Linux内核驱动程序:NVRAM访问的模型是什么?

我刚刚在我的主板上为恩智浦RTC芯片编写了一个RTC驱动程序,效果很好.这个芯片还有一些电池支持的RAM,我想提供给用户空间应用程序.RTC框架不支持这一点.它只有512个字节,但我在做一个可寻找的CHAR驱动程序或一个完整的BLOCK驱动程序之间徘徊.我之前从未做过块驱动程序,但它似乎需要比简单的CHAR更多的信息.

我也可以与IOCTLS接口,但感觉不尽如人意.什么感觉是让这些字节可供用户使用的最佳方式?

[编辑]我忘了提到RTC芯片悬挂在I2C端口上,它没有映射到内存中,因此不能成为mmaping的好选择.[/编辑]

linux-device-driver linux-kernel embedded-linux

8
推荐指数
1
解决办法
2822
查看次数