小编tre*_*nki的帖子

为嵌入式Linux设备实现更新/升级系统

我有一个在嵌入式Linux设备上运行的应用程序,并且偶尔会对软件进行更改,有时也会对根文件系统甚至已安装的内核进行更改.

在当前的更新系统中,只删除旧应用程序目录的内容,并在其上复制新文件.当对根文件系统进行更改时,新文件将作为更新的一部分传递,并简单地复制到旧文件上.

现在,目前的方法存在一些问题,我正在寻找改善这种情况的方法:

  • 用于创建文件系统映像的目标的根文件系统未进行版本控制(我认为我们甚至没有原始rootfs).
  • 手动选择进入更新的rootfs文件(而不是diff)
  • 更新不断增长,成为一个皮塔饼.现在,更新/升级之间存在拆分,其中升级包含更大的rootfs更改.
  • 我的印象是,如果完全实现,更新中的一致性检查相当脆弱.

要求是:

  • 应用程序更新包不应太大,并且必须能够在已进行修改的情况下更改根文件系统.
  • 升级可以更大,只包含进入根文件系统的内容(如新库,内核等).更新可能需要安装升级.
    升级是否可以包含整个根文件系统,只需dd在目标的闪存驱动器上执行操作?
  • 创建更新/升级包应尽可能自动化.

我绝对需要一些方法来对根文件系统进行版本控制.这必须以某种方式完成,我可以从中计算某种diff可用于更新目标设备的rootfs的方法.

我已经查看了Subversion,因为我们将它用于源代码,但这对Linux根文件系统(文件权限,特殊文件等)不合适.

我现在已经创建了一些shell脚本,可以给我类似的东西,svn diff但我真的想知道是否已经存在一个可行的,经过测试的解决方案.

使用这样diff的我认为升级将简单地成为包含基于已知根文件系统状态的增量更新的包.

你对此有何看法和想法?你会如何实现这样的系统?我更喜欢一个简单的解决方案,可以在不太长的时间内实现.

linux software-update embedded-linux

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

从C代码设置ALSA主卷

我一直在寻找一个简单的C代码示例来设置ALSA混音器的主音量,但是对于这个所谓的常见操作却找不到任何简单的东西.

我对ALSA完全不熟悉,所以制作我自己的最小例子需要时间.如果有人能提供,我会很高兴.

c linux embedded mixer alsa

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

C++强化学习库

我一直在寻找一个实现强化学习算法的C++库,但对结果并不是很满意.

我从TU Graz 找到了Reinforcement Learning Toolbox 2.0,但不幸的是这个项目很老了,我无法编译.

还有来自Hado van Hasselt的代码.它看起来很有希望,但似乎没有积极维护.

您在C++中使用哪些库进行强化学习?

c++ machine-learning reinforcement-learning

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

ARM未对齐的内存访问解决方法

我必须将源代码移植到运行Linux的ARM平台.不幸的是,我遇到了未对齐的内存访问问题.源使用指针强制转换和访问.

像下面这样的代码像病毒一样遍布代码库.由于gcc -Wcast-align命令行选项,我可以查明有问题的位置但是有超过一千个实例要经历.

u = (IEC_BOOL);
(((*(IEC_LINT*)pSP).H < b.H) 
   || (((*(IEC_LINT*)pSP).H == b.H) && ((*(IEC_LINT*)pSP).L < b.L) )) ? 1 : 0);
*(IEC_DWORD OS_SPTR *)pSP = 
    (IEC_DWORD)(*(IEC_DWORD OS_SPTR *)pSP >> u);  
*(IEC_DWORD OS_SPTR *)pSP = 
    (IEC_DWORD)(*(IEC_DWORD OS_SPTR *)pSP << -u);  
u = (IEC_BYTE)((*(IEC_DINT*)pSP != b) ? 1 : 0);  
*(IEC_DWORD*)pSP = (IEC_DWORD)(*(IEC_DWORD*)pSP & w);  
(*(IEC_ULINT*)pSP).H += u.H;   
(((*(IEC_ULINT OS_SPTR *)pSP).H == b.H) 
    && ((*(IEC_ULINT OS_SPTR *)pSP).L > b.L))) ? 1 : 0);
u = (IEC_BYTE)((*(IEC_REAL*)pSP >= b) ? 1 …
Run Code Online (Sandbox Code Playgroud)

c memory gcc arm

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

为什么在android上重定向stdout/stderr不起作用?

我下载了SDL 1.3并在我的Android 2.2设备上与OpenGL ES一起测试了它.它工作正常,但我没有得到printf呼叫的输出.我尝试了android开发者页面中提到的下面的命令,但是DDMS在Eclipse中都没有adb logcat报告程序使用的字符串printf.我确保过滤stdout标签.

$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start
Run Code Online (Sandbox Code Playgroud)

我错过了什么或做错了什么?

android native stdout android-ndk

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

嵌入式Linux许可LGPL/GPL /等

我想知道我必须做些什么来遵守我的嵌入式Linux系统使用的各种开源软件工具和库的许可.

我的情况如下:

我在嵌入式设备上运行嵌入式Linux系统.它使用由第三方提供的根文件系统映像以及用于开发的工具链.

我通过添加一些已编译的开源程序(在各种许可下)对根文件系统映像进行了一些修改,现在它还包含Qt(LGPL).

我的应用程序动态链接到根文件系统上的库,也使用Qt.

这些设备通过预先安装的内核,rootfs和应用程序交付给最终用户.可以更新/升级包括rootfs和可能的内核的应用程序.


我已经看到在Android上,文件及其相应的许可证只是列在一个长文本文件中.是否有必要以这种方式列出所有单个文件,还是有其他方法来处理此问题?

这通常是怎么做的?

linux embedded licensing

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

Dapper歧义扩展方法

我正在将Dapper作为ORM解决方案进行测试,并且遇到了某些扩展方法(例如Execute或)的问题QueryMultiple

using (SQLiteConnection con = new SQLiteConnection(GetConnectionString()))
{
    con.Open();
    string sql = @"
        select * from Customer where Id = @id;
        select * from Address where CustomerId = @id;";

    // QueryMultiple extension ambiguous?
    using (var multi = con.QueryMultiple(sql, new { id = 1 }))
    {
        Customer customer = multi.Read<Customer>().Single();
        Address address = multi.Read<Address>().Single();
    }

    con.Close();
}
Run Code Online (Sandbox Code Playgroud)

我得到错误

在以下方法或属性之间的调用是模棱两可的:'Dapper.SqlMapper.QueryMultiple(System.Data.IDbConnection,字符串,对象,System.Data.IDbTransaction,int ?, System.Data.CommandType?)'和'Dapper.SqlMapper .QueryMultiple(System.Data.IDbConnection,string,dynamic,System.Data.IDbTransaction,int ?, System.Data.CommandType?)'

而且不知道如何正确解决这个问题。Dapper的例子没有提到这样的问题,只是使用了QueryMultiple。我能够使用以下方式避免歧义

var multi = con.QueryMultiple(new CommandDefinition(sql, new { id = 1 …
Run Code Online (Sandbox Code Playgroud)

c# dapper

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

Dapper使用奇异的表名

我试验了Dapper和Dapper.Contrib.我有以下课程:

public class Customer
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
    public bool Active { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

它被映射到多个表" Customers".是否有一种简单的方法可以让Dapper为所有表使用单个表名?

c# dapper

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

C函数调用和参数跟踪 - 测试用例和模拟生成

我在嵌入式系统上有很大的C代码代码库,遗憾的是没有自动测试用例/套件.这使得重构和重构代码成为一项危险的任务.

手动编写测试用例非常耗时,因此我认为应该可以自动执行此过程的至少某些部分,例如通过跟踪所有函数调用和记录输入和输出值.然后,我可以在测试用例中使用这些值(这对所有人都不起作用,但至少对于某些函数而言).也可能基于收集的数据创建模拟函数.

拥有这样的测试用例会使重构变得不那么危险.

有没有解决方案已经可以做到这一点?如果我必须自己编写代码,最简单的方法是什么?

我想ctags用于查找函数定义,并将它们包装在记录参数值的函数中.另一种可能性可能是gcc编译器插件.

c trace unit-testing mocking

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

如何使用QCoreApplication :: postEvent注入合成输入事件

我正在注入键盘和鼠标事件,这些事件通过网络传入我的Qt应用程序并QCoreApplication::postEvent用于此.鼠标坐标是绝对屏幕像素坐标.

QMouseEvent *event = new QMouseEvent(type, QPoint(x, y), mouse_button, mouse_buttons,
    Qt::NoModifier);
QCoreApplication::postEvent(g_qtdraw.main.widget, event);
Run Code Online (Sandbox Code Playgroud)

最初我只有一个小部件(引用g_qtdraw.main.widget)所以我只是使用那个小部件作为接收器参数postEvent.现在我的应用程序有多个小部件,上面的代码不能再做我想要的了.

第二个小部件以全屏模式显示,我知道所有鼠标事件都必须转到此窗口,但使用上面的代码,它们仍然会路由到主窗口小部件.

如何选择正确的小部件作为接收器(鼠标x,y coords下的小部件)?有没有一种标准的方式,所以Qt选择正确的小部件还是我必须自己跟踪?

编辑

我现在使用以下工作正常(非常感谢Dusty Campbell):

QPoint pos(x, y);
QWidget *receiver = QApplication::widgetAt(pos);
if (receiver) {
    QMouseEvent *event = new QMouseEvent(type, receiver->mapFromGlobal(pos), mouse_button,
        mouse_buttons, Qt::NoModifier);
    QCoreApplication::postEvent(receiver, event);
}
Run Code Online (Sandbox Code Playgroud)

c++ qt

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