应用编程
SylixOS 程序使用 execl()系列函数无法加载程序
Q: SylixOS 程序使用 execl()系列函数无法加载程序? SylixOS 提供 execl()系列函数来加载可执行文件,替换本进程空间内的执行程序。 SylixOS 要求 execl()函数必须在一个进程的主线程内被调用,他将回收当前进程空间并保留进程控制块,然后使用新的程序替换当前进程执行的程序。
SylixOS 中链接 libvpmpdm.a 时不能正常运行业务代码?
Q:当使用静态库libvpmpdm.a,链接可执行程序时,操作系统会因为能找到main函数,但是找不到start函数,而不启动应用程序。如果操作系统是release版本的,应用程序不但起不来,shell上面没有任何的异常输出,导致追查程序启动异常非常困难。 我们做了个测试,如果将libsylixos/Output目录下的 libvpmpdm.so 删除,直接编译SylixOS应用,SylixOS 应用将链接了 libsylixos/Output 目录下 libvpmpdm.a ...
使用 GDB 命令行调试 SylixOS 应用程序
一、简介 SylixOS 在内核中内置了一个标准的 GDB Server。使用 GDB 调试,只有两个步骤: 在 SylixOS 上启动 GDB Server; 使用交叉编译工具链中的 GDB 应用程序连接到 SylixOS 上的 GDB Server。 两个步骤完成后,便可以使用 GDB 进行调试了 注:SylixOS 的 GDB 不支持 Watch 变量的功能,因为 Stub 不支持数据断点。 二、前提条件 1. 断开硬件调试工具 GDB 依靠 CPU ...
缺页中断后,系统被重启(任务被kill)
Q:系统发生缺页中断后打印了一些调试,系统就重启或者任务被 kill 了? 由于 SylixOS 操作系统为了保持硬实时操作系统的特性,所以内核与应用程序没有严格的隔离,缺页中断如果发生在内核被锁定或者中断中,则操作系统不能正确处理,这里需要应用程序开发者与驱动开发人员注意。 更多扩展知识见: 参考文章:处理器包含多级中断系统,BSP部分该如何设计? 参考文章:系统遇到哪些异常时,会导致系统重启
创建的命名 posix 对象无法在文件系统中找到?
Q: 为什么创建的命名 posix 对象无法在文件系统中找到. SylixOS 使用一个独有的符号空间来管理命名的 posix 对象 (很多操作系统都是如此). 这些对象并不存在于文件系统中. 如果系统加入了 proc 文件系统的支持, 则可以通过查看 /proc/posix/pnamed 文件来查看 posix 命名对象的使用情况.
添加标准 C 库头文件会与 SylixOS 内部数据结构冲突
Q: 为什么加入一些标准 C 库头文件会与 SylixOS 内部数据结构冲突? SylixOS 为了提高兼容性与稳定性,SylixOS 提供了一套最适合自身多线程操作系统特点的标准 C 库(暂不包含数学库). 这套 C 库相关代码是从其他开源项目中演变而来。当然为了配合 SylixOS 系统,很多地方做出了修改。 这些库中相关的定义会随着 #include <SylixOS.h> 一同引入用户程序,当用户引用其他辅助 C 库时, 可能产生一些重复定义问题。 这里推荐使用 SylixOS 提供的 ...
用户 GPIO 中断实现
Q:用户 GPIO 中断实现应用 1. 应用场景 经常有用户会提到这样的使用方式:定义一个周期性的 GPIO 中断,应用层收到该中断信号后做出相应的动作,按照目前的情况来看,这种使用方式不外乎两种,一是直接使用片内或者外扩的具备中断功能的 GPIO 去实现该项功能,二是 GPIO 这一侧的功能使用 FPGA 来实现,定期的去发送某个电平或者上升沿/下降沿,某些用户更习惯将这种方式称之为“秒脉冲”或者“同步中断”。 2. 问题 ...
qt5中链接使用.so动态库及相关函数
Q:如何在qt5中链接使用.so动态库及相关函数 1. 编译生成动态库文件并上传至SylixOS文件系统内(需要上传至qt5的path目录内) 图1 编写并生成动态库工程 图2 上传动态库文件 qt5的path目录可env命令查看,见下图 图2 查看qt5默认库路径 2. 在qt工程pro文件内添加动态库相关本地配置(用于编译) 图4 增加动态库链接配置 3. 部署qt应用程序至SylixOS设备中 4. 运行测试 图5 程序运行测试
error: undefined reference to `__dso_handle'
Q:CPP库移植时,报undefined reference to `__dso_handle'的错误,具体见下图 GCC 编译的 C++ 程序需要存在一个 __dso_handle 符号, 这个符号的功能详情请查看 SylixOS c++ 运行时库的代码 如果应用程序用到此符号, 则需要连接 dsohandle 库, 名为 libdsohandle.a 此库必须为静态链接库, 具体代码在 SylixOS 根目录 dsohandle 目录中
RealEvo-IDE SylixOS APP 工程如何进行 C/C++ 相互转换
Q: 问题描述 ① 在使用 RealEvo-IDE 创建 C 工程,右键该工程选择 “SylixOS—>Convert to C++” 后无法再转回 C 工程。 ② 经过上述 ① 的步骤之后,再次右键工程,发现“Convert to C++”选项消失。 解决方法 ① 转换成 C++ 工程后,最核心的地方在于工程的 mk 文件,C++ config 栏中的 LOCAL_USE_CXX 会变为 “yes”,若要转回 C 工程,将该配置改为 “no” 即可,详情如下图所示: ② ...
lib_ffs 和 lib_ffsll 函数说明
一、函数作用 lib_ffs 函数是获取一个 int 类型数据第一个 bit 为 1 的位。lib_ffsll 函数是获取一个 long long int 类型数据一个 bit 位 1 的位。 二、lib_ffs函数 lib_ffs 函数是将 int 类型数据强转为 unsigned int 类型进行运算。 archFindLsb函数,先比较低 16 位和高 16 位,哪个先有 1;然后再比较那 16 位的低 8 位和高 8 位,哪个先有 1;最后再查表获得第一个bit为1的位。 ...
SylixOS 设置进程亲和度
Q:SylixOS 线程绑定到指定CPU核运行 sched_setaffinity 函数亲和指定进程内所有线程在指定 cpu 集上运行,该函数只用于多核情况。 使用方法是先使用 sched_setaffinity 或 pthread_setaffinity_np 将某些线程或进程绑定到某个核上,然后再调用 sched_cpuaffinity_enable_np 使能强亲和。 详见《SylixOS 应用开发手册》第8章 ...
SylixOS 下的 sqlite3 使用
一、准备工作 1. 建立 SylixOS App 工程 2. 包含头文件 “sqlite3.h”,配置详情如下: 3. 链接 sqlite3.so ,LinkerSetting 设置好后点击弹出窗口 “是” 将会自动添加 Library Path。 至此,可正常在源文件中使用 sqlite3 相关接口。 二、sqlite3 基础 1. sqlite3 命令行模式 ①命令都是‘.’(点号)开始 ②SQL 语句都是以‘;’结尾 2. sqlite3 常用命令 三、sqlite3 主要接口介绍 1. ...
RealEvo-IDE 串口调试 app 补充说明
需求 对于不支持以太网接口的设备,可以使用串口进行手动启动调试,基本流程参见《RealEvo-IDE使用手册》中 5.3 小节的内容。 为了用户能正常使用该功能,本文档将实际操作中的细节整理如下。 硬件设备 本次演示使用的硬件设备是翼辉信息的T3工业控制器IGC1500,串口设备信息如下: 1 个 RS232 Debug 接口: 设备名/dev/ttyS0,对应于接线端子 RS232-2,端口信号为 RX2,TX2,GND。 2 个 RS232 用户接口: 设备名/dev/ttyS5,对应于面板 ...
SylixOS 的编译工具链优化等级是怎样的?
Q:SylixOS 的 IDE 开发环境中,配置工具链中的 release 和 debug 选项优化等级是怎样的? 在 SylixOS 的 IDE 中编译工具链 release 是 O2 优化等级,debug 是 O0 优化等级。
如何将 GBK 编码的中英文特殊字符转换为十六进制
问:如何将 GBK 编码的中英文特殊字符转换为十六进制 #include <iostream> #include <sstream> #include <stdlib.h> #include <string.h> #include <iconv.h> #include <stdio.h> #include <ctype.h> using namespace std; //编码转换,source_charset 是源编码,to_charset 是目标编码 std::string ...
使用 mmap 函数进行共享内存映射时失败
问:使用 shm_open 函数创建共享内存设备文件,shm_open 函数返回一个文件描述符,然后使用 mmap 函数映射该共享内存到进程的虚拟空间内,mmap 函数返回一个虚拟地址,之后便可以通过这个虚拟地址对共享内存进行读和写操作。 但是使用 shm_open 创建文件后,使用 mmap 函数进行映射会出现下图中的错误。 答:如果一个文件的数据长度为 0,则不能使用 mmap 建立映射,此时使用 mmap 函数将会失败。对于共享内存设备上的文件,不能保证在所有的系统中都能够使用 ...
TCP/UDP 通信中 server 端异常关闭后无法再次连接
Q:在 TCP/UDP 通信中,服务器和客户端正常通信时若手动异常关闭 server 端进程,再次运行开启 server 端程序会在 bind 函数位置报错,造成无法连接? 尝试在 bind 函数前添加 setsockopt 函数增加复用功能,重用本地地址,代码如下 iRet = setsockopt(sockFd, SOL_SOCKET, SO_REUSEADDR, &iRet, sizeof(int)); if(iRet < 0){ ...
在使用静态映射和动态映射时,出现错误
Q:在使用静态映射和动态映射时,出现错误? 动态映射出来的虚拟地址只对 cpu 访问有效,其他 dma 控制器对虚拟地址是不可见的,一块内存如果不是 cpu 读取则必须平板映射(静态映射) 如果只是 dma 访问的话,直接访问物理地址就行,不需要映射。 Cpu 和 dma 都会访问的内存空间,前一部分让 cpu 访问,后一部分让dma访问 动态映射:API_VmmIoRmapNocache 要求页对齐 eg:atVirtBase = ...
SylixOS 中应用程序的 socket address 被占用问题
问: SylixOS 中应用程序的 socket address 被占用问题,如何处理? [root@sylixos:/apps/test_tool]# ./test_tool & [root@sylixos:/apps/test_tool]# test tool init failed can not bind socket Address already in use. 在应用程序中,如果存在服务器 socket监听时,重启应用程序,常会出现上述 socket 地址被占用的情况,可以通过设置 ...
SylixOS 动态关核架构流程
1. SylixOS 动态关核接口 SylixOS 支持动态关核操作,通过如下应用函数; VOID Lw_PowerM_CpuSet(ULONG ulNCpus, UINT uiPowerLevel); 函数Lw_PowerM_CpuSet原型分析: 参数 ulNCpus是运行态的CPU 核个数; 参数 uiPowerLevel是CPU能耗级别。 2. 基本流程 系统函数调用流程如图 2.1: (1) Lw_PowerM_CpuSet( ...
SylixOS调试不支持数据断点
Q:调试的时候 attach 到进程,立马死掉,或者调试的时候出现很多诡异现象。 解决方法: 先叫用户在 IDE 下面检查是断点设置情况,或者直接清空断点,然后再链接,看下调试功能是否就好了,如果好了,说明之前可能出现无意中触发设置数据断点的功能了。