作者| 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下载|芯片、开发板购买