Articles of embedded linux

系统+ usleep +multithreading= SEGV / SIGILL

我正在使用内核版本2.6.10和“普通”C. 我已经缩小到两个线程为什么我们的程序崩溃。 定时器线程 void TimerThread(void) { while (exec) { usleep(10000); RSLTCD r = SUCCESS; // r = LockMutex(Mtx); do { // some process } while(1); // r = UnlockMutex(Mtx); } return ; // Not Reached } 系统线程 void SystemThread(void) { CreateThread(TimerThread, OALTHRD_DEFAULT_STACKSIZE, THREADPRI_NORMAL, 0, 0); for(;;){ system("echo this is a SYSTEM CALL 1"); system("echo this […]

针对时间敏感的应用程序的分析方法

我正在embedded式Linux环境中debugging与Zigbee设备的配对/绑定有关的高度时序敏感问题。 我们的架构是通过SPI接口从Zigbee前端模块读取数据,然后从内核空间传递到用户空间进行处理。 然后将处理后的数据和响应传回内核空间,再次通过SPI接口输出。 Zigbee 802.15.4的时序要求规定我们需要在19.5ms内响应,而且我们经常会遇到这样的情况:我们只是在这个窗口之外响应,导致networking出现故障和丢包。 Linux内核没有启用先占权运行,也可能无法启用先占权。 我怀疑是因为内核不能抢占,所以还有另一个使用ioctl()接口的任务/进程,这足以让超过19.5ms的窗口足够长的Zigbee应用程序。 我已经尝试了以下工具 oprofile – 在这里没有太多的帮助,因为它剖析整个系统,在这段时间内应用程序实际上并不是非常繁忙,因为它移动了如此less量的数据 strace – 开销太多,我没有太多的经验,所以也许输出可以被改进。 开销会影响性能,所以应用程序根本就没有function 有没有其他轻量级的方法来分析这样的系统? 有没有办法赶上一个ioctl的呼叫挂在另一个任务/线程? (假设这是问题的根源)

i.MX6上的Yocto + Qt5(FSL社区BSP):webkit的xcb依赖关系?

我正在学习Yocto(头晕),我正在为飞思卡尔基于i.MX6的系统准备一个映像。 我从FSL社区BSP开始,然后包含meta-qt5层。 然后,我通过local.conf文件做了一些定制,以便编译Qt并从编译中排除X11和Wayland(因为我想通过EGLFS平台使用Qt5): EXTRA_IMAGE_FEATURES = "debug-tweaks ssh-server-openssh" IMAGE_INSTALL_append = " gcc g++ binutils libgcc libgcc-dev libstdc++ libstdc++-dev libstdc++-staticdev \ autoconf automake ccache chkconfig glib-networking glibmm \ packagegroup-core-buildessential pkgconfig \ boost cmake zlib glib-2.0 packagegroup-fsl-tools-testapps git glive \ ruby \ cpufrequtils \ nano \ gdb \ gstreamer \ gst-meta-video \ gst-fsl-plugin \ gst-plugins-base-app \ gst-plugins-base \ […]

如何更改Linux上的tty组(使用buildroot构build)

我正在使用Buildroot为embedded式设备开发Linux Kernel 3.14.28版本。 在/dev/ ,所有的ttys都是root:root而不是root:dialout像标准的Linux一样root:dialout 。 因此,不能以root身份login任何ttyX。 如何将tty组永久更改为root:dialout ? 我尝试用chown命令改变它,但是在重新启动时它又变成了root:root 。

如何将networking接口设置为静态或DHCP编程(脚本,节点或c)?

我正在开发一个通过运行express.js的节点服务器访问的embedded式系统。 我试图为我们的用户提供的function之一是能够通过Web UI / REST调用来configurationnetworking接口,而不需要下拉到SSH会话。 这是我的问题:是否有程序化的方式设置接口为DHCP或静态? 编辑/ etc / network / interfaces之后,我还没有能够谷歌或stackoverflowsearch一个编程方法。 任何人都可以推荐一个方向和/或最佳做法做到这一点? ps,我应该提到,作为我的改变的一部分,我将有必要的configuration参数(例如,地址,networking掩码,网关),当然,我会以ifconfig为前缀做任何更改。

为什么/ etc / network / interfaces在程序化更改和后续重启之后会变空?

我在提供Web UI的embedded式设备上运行node.js服务器,以允许用户修改networking接口设置 – 例如,从静态更改为DHCP或反之,或设置特定的静态IP设置(networking掩码,网关)等。通过这些用户驱动的configuration参数,我能够以编程方式生成一个新的/ etc / network / interfaces文件(当然,在将以前的文件备份到/etc/network/interfaces.bak文件之后)。 我甚至对新configuration文件的日志文件做一个“cat / etc / network / interfaces”来确认新的接口文件的内容和语法的有效性。 到目前为止,一切都是疯狂的。 但是,如果在我的设备上重新启动(有或没有/etc/init.d/networking停止/重新启动前启动),我发现系统多次出现一个空的/ etc / network / interfaces文件因此,没有networking接口。 (幸运的是,我有一个允许SSH连接的JTAG接口,所以仍然可以连接到我的设备,但是对于用户来说,他们的设备基本上是砖砌的。) 什么会导致操作系统空白/ etc / network / interfaces文件? 我认为这必须在系统初始化时完成 – 但是出于什么原因呢? 如果我使用文本编辑器手动进行相同的更改并重启,则一切正常 – 每次都会出现新的界面设置。 我无法解释可能导致这种行为的原因。 – 以下是我考虑但已排除的其他因素: 也许文件没有正确保存? 我排除了这个,因为cat命令会显示它已经成功保存了。 也许有其他文件(或持久性设置)需要修改,没有这些configuration被认为是无效的和消隐? 我排除了这一点,因为我的理解是接口文件是接口设置所需的唯一configuration。 也许接口文件中有合成错误。 我排除了这一点,因为我已经比较了我的编程输出到有效的文件,事情看起来很好。 此外,我不认为syntatic错误会导致一个文件被消隐。 编辑:我的设备是基于TI Sitara uP运行Debian Wheezy 3.14变种。 我运行node.js v0.12.x作为服务器后端。

将“V”写入看门狗设备文件的含义

当我们echo V > /dev/watchdog时,这意味着什么? 有一篇文章说可以防止意外停止看门狗。 我不清楚这个目的。

部署设备树叠加时出错

我正在为我的Beaglebone Black部署设备树覆盖层。 Linux版本是: Linux version 4.1.18-ti-r52 (root@b1-omap5-uevm-2gb) (gcc version 4.9.2 (Debian 4.9.2-10) ) #1 SMP Thu Mar 10 00:41:28 UTC 2016 我在https://github.com/jadonk/validation-scripts/blob/master/test-capemgr/README.md上查看示例。 我也通过Derek Molloys的“探索BeagleBone黑皮书”第6章中的例子。在这两种情况下,当我部署覆盖层时,我遇到了同样的错误。 覆盖似乎正确部署,执行echo> $ SLOTS时没有发生错误,但是当我使用dmesg查看内核消息时,出现如下所示的错误。 下面显示的是从jadonk例子。 [ 1053.452639] bone_capemgr bone_capemgr: Using override eeprom data at slot 5 [ 1053.452664] bone_capemgr bone_capemgr: slot #5: 'Override Board Name,00A0,Override Manuf,pinctrl-test-7' [ 1053.455556] pinctrl-single 44e10800.pinmux: pin 44e10964.0 […]

使用O_DIRECT和IO内存

我试图从I / O内存(HIGHMEM)写入一些数据到硬盘。 我已经使用io_remap_pfn_range()mmap了内存缓冲区。 我的应用程序使用O_DIRECT进行磁盘读写操作。 使用O_DIRECT,写入返回EFAULT(坏地址)。 我把它logging在mm / memory.c中的__get_user_pages,IO页面被拒绝。 这和我现在的知识一样深,可以让我进入内核。 我不明白为什么IO指针不被允许。 超快磁盘IO是我们项目的一个要求,所以任何复制都不是一个选项。 任何暗示是赞赏。 提前致谢!

如何testing内核来识别内核中可能导致内核恐慌的问题

我有一个embedded式Linux设备。 我试图想出一些testing用例,这些testing用例可以在内核中运行各种子系统,代码path和系统调用,以识别导致内核恐慌的内核中的问题/松散结束。 有人可以提出一些testing想法这种testing? 否则,有人可以提出一些想法来testing内核,使它可以更稳定,健壮,高效,快速等? 我们可以编写Linux内核的unit testing吗?