周五见| 系统开发相关问题讲解

Comake Online


作者| yongfeng.wu、An、koda.xu、wenju.lu


Comake社区技术问题汇总,第20230505期,本期主要汇总了系统开发相关的问题。



本期问题速览


▪ telnet输出带宽数据方法


▪  打开kernel CONFIG_MODVERSIONS匹配规则


▪  如何释放uboot下bootlogo申请的内存?


▪ 串口没有输出时,有没有办法dump出kernel dmsg?


▪ 在CPU支持多核的环境下,怎么将irq绑定到指定的cpu核心?


▪  ARM处理器中的char的处理方式


▪  分区问题:V050版本是否有kernel备份功能?


▪ 如何确定当前项目编译使用的mk文件?




Q1:telnet输出带宽数据方法


A1:在telnet端查看占用的方法如下:


1. 首先查看num序号和是否Enble:

cat /sys/devices/system/miu/miu_bw0/monitor_rcmd_client_enable



2. 添加需要的ip num,例如:



3. 最后一句echo 0 > measure_all_hw为修改输出到telnet端


4. 在telnet端输入查看带宽命令: 

cat /sys/devices/system/miu/miu_bw0/measure_all_hw


注:由于kernel size的限制,此处ip不能太多,请挑选一些需要查看带宽的ip enble。


》》原帖地址



Q2:打开kernel CONFIG_MODVERSIONS匹配规则


A2:1. Kernel 打开CONFIG_MODVERSIONS,module不打开CONFIG_MODVERSIONS:将不会检查CRC,但是会完整匹配vermagic,因为两者的vermagic中“modversions”的差别,模块将不会加载成功。


2. Kernel 打开CONFIG_MODVERSIONS,module打开CONFIG_MODVERSIONS:将会检查CRC,然后匹配vermagic的第一个空格后的部分,例如, 若vermagic为“3.10.49-gc7c11ec SMP preempt mod_unload modversions aarch64”, 则只会使用”SMP preempt mod_unload modversions aarch64来匹配”, 即SMP, 模块卸载等关键特性还是需要进行检查。


3. kernel 不打开 CONFIG_MODVERSIONS, module 打开 CONFIG_MODVERSIONS, 将会完整匹配vermagic, 但是因为两者的vermagic中“modversions”的差别, 模块将不能加载成功。


4. kernel 不打开 CONFIG_MODVERSIONS, module 不打开 CONFIG_MODVERSIONS, 完整匹配vermagic。


》》原帖地址



Q3:在u-boot bootlogo里,使用的是mmap_reserved=fb指定的内存,这块内存如何释放给kernel使用


A3:这块内存是用来保证bootlogo在启动的过程中,不被其他内核模块踩到而预留的,如果sigmastar自带的fb, 在内核启动完成之后,应用通过Ioctrl “FBIOPAN_DISPLAY” 完成释放。但如果不使用自带的fb,比如使用FBTFT,没有这块动作,导致系统可用内存减少,这个时候可以使用如下命令来释放这块内存。



》》原帖地址



Q4:串口没有输出时,有没有办法dump出kernel dmsg


A4:如果Sstar System Tool还能连上的话,可以通过直接dump log buffer的方法获取。


1. 确认下log buffer的addr(0xc0495248 - 0xc0000000)



2. 使用 Sstar System Tool dump DRAM内的数据



buffer的size由kernel config 定义



》》原帖地址



Q5:在CPU支持多核的环境下,怎么将irq绑定到指定的cpu核心?


A5:可以使用下面的方式来指定irq运行在那个cpu内核上。


1. 通过echo方式指定


例如,将下图中timer0的中断绑定到指定的cpu核上。



可以看到该中断的irqnum为57。使用下面的指令来指定需要绑定的cpu核,cpumask的bit对应cpu内核,当仅bit0为1时表示irq只运行在cpu0,当仅bit1为1时表示irq只运行在cpu1,若bit0和bit1都为1则irq同时跑在cpu0和cpu1上。


echo [cpumask] > /proc/irq/57/smp_affinity



2. 在驱动代码中指定


在申请irq中断后可以通过irq_set_affinity_hint来设置irq运行在那个cpu内核上。使用方式如下:


int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m)
第一个参数为irqnum,第二个参数实际为cpumask,同方式1的echo值。



cpu_online_mask实际为3,表示该中断会运行在cpu0和cpu1上。


》》原帖地址



Q6:ARM处理器中的char的处理方式默认是按无符号处理的,怎么指定char的处理方式?


A6:可以在编译应用时指定编译参数-fsigned-char和-funsigned-char来指定char的处理方式。使用方式如下:


测试应用:



ARM默认将char按unsigned char处理:
arm-linux-gnueabihf-gcc -o testArmChar testArmChar.c
输出:



编译时指定-fsigned-char将char按signed char处理:
arm-linux-gnueabihf-gcc -o testArmChar_signed -fsigned-char testArmChar.c
输出:



编译时指定-funsigned-char将char按unsigned char处理:
arm-linux-gnueabihf-gcc -o testArmChar_unsigned -funsigned-char testArmChar.c
输出:




》》原帖地址



Q7:分区问题:V050版本是否有kernel备份功能?


A7:有的,RECOVERY分区就是KERNEL分区的备份。


测试方法


在可以正常程序中,擦除KERNEL分区程序,然后重启,如果可以正常启动到kernel,则擦除RECOVERY分区程序。


如果此时发现擦除RECOVERY分区程序后就无法正常启动到kernel,则代表RECOVERY分区是KERNEL分区的备份。


设置方法


一般用户无需专门去设置,在设置分区的parttion文件中的kernel分区设置的地方已经自动定义了与KERNEL分区相同的RECOVERY分区。


》》原帖地址



Q8:project\image\configs下面有很多mak文件,如何确定当前项目使用的是哪些mak呢?


A8:参照环境搭建,我们的编译SDK的流程是首先选定项目用的config, 然后再进行make image。


make config之后会在project\configs下面生成current.configs,内部有很多编译相关的宏定义。当我们再进行make image时,在project\makefile中会include这个文件。



从makefile中我们找到image_install这个taget的依赖。



再进一步查看project/image内额makefile, 就可以看到include了哪些mak文件了。



》》原帖地址



如您在开发的过程中遇到系统开发相关问题,或您需要技术支持选型支持商务支持,欢迎进入Comake社区开发论坛发帖咨询,社区技术工程师和运营人员将会及时响应您的诉求。



往期回顾


周五见| 网络开发相关问题讲解


周五见| Audio开发相关问题讲解


周五见| 点屏开发相关问题讲解


周五见| Sensor相关问题讲解


周五见| Uboot开发相关问题讲解





扫码进入论坛

原厂答疑|产品选型|官方资源



扫码咨询客服

SDK下载|芯片、开发板购买


X 提交 下一题

查看更多