基于 DR1M90 的 Linux-RT 内核开发:从编译配置到 GPIO / 按键应用实现(2)

系统开发说明

Linux-RT内核与普通Linux内核在系统开发上基本保持一致,具体操作方法请参考《Linux系统开发手册》。

其中,使用Linux-RT内核进行系统开发仅在Kernel开发的配置与编译环节存在关键差异,其他开发流程(如U-Boot开发、Rootfs开发等)与普通内核完全一致。以下对Linux-RT内核的Kernel进行说明。

Kernel开发(Linux-RT)

Kernel配置

执行如下命令,进入LinuxSDK源码目录下的内核目录,打开图形配置界面。

Host# cd /home/tronlong/DR1/SDK_2025.1/

Host# ./build.sh kernelmenuconfig

图 28

(1)配置RT内核

打开图形配置界面,依次打开"General setup -> Preemption Model(Preemptible Kernel(Low-Latency Desktop))"。

图 29

图 30

进入如图所示界面后,选择"Fully Preemptible Kernel (Real-Time)",接着选择**<Save>**保存。

备注:我司提供的普通内核版本默认为"Preemptible Kernel(Low-Latency Desktop)"

图 31

图 32

其他选项的参数解析如下表所示。

(2)配置Linux-RT内核定时器频率

打开图形配置界面,依次打开"Kernel Features -> Timer frequency(250 HZ)"。

图 33

图 34

进入如图所示界面后,选择"1000 HZ",接着选择**<Save>**保存。

备注:普通Linux内核需要选择"250 HZ"。

图 35

图 36

配置完成后,将配置选项自动保存到LinuxSDK根目录下的"linux/arch/arm64/configs/anlogic_dr1m90_defconfig"中,执行如下命令,检查RT内核是否配置成功。

**Target#**grep -nr "PREEMPT_RT" ./linux/arch/arm64/configs/anlogic_dr1m90_defconfig

**Target#**grep -nr "1000" ./linux/arch/arm64/configs/anlogic_dr1m90_defconfig

图 37

编译Kernel

请参考《Linux系统开发手册》的Kernel开发章节编译Kernel。

应用开发说明

Linux-RT内核与普通Linux内核在应用开发上保持一致,具体操作方法请参考《Linux应用开发手册》。

本章节说明Linux-RT应用开发组件支持情况并介绍基于Linux-RT内核开发的应用案例。

rt_gpio_ctrl案例

案例说明

通过创建一个基本的实时线程,在线程内触发LED的电平翻转,同时程序统计实时线程的调度延时,并通过示波器测出LED电平两次翻转的时间间隔。由于程序默认以最高优先级运行,为避免CPU资源被程序完全占用导致系统被挂起,因此在程序中增加100us的延时。程序原理大致如下:

(1)在Linux-RT内核上创建、使用实时线程。

(2)实时线程中,计算出触发LED电平翻转的系统调度延时。

案例测试

执行如下命令,查看程序运行参数。

Target#./rt_gpio_ctrl -h

图 38

参数解析:

-t:程序运行时间,单位s,默认为10s;

-d:延迟时间,单位us,默认为100us;

-h:打印帮助信息。

将案例bin目录下的可执行文件拷贝至评估板文件系统,并执行如下命令运行测试程序,指定程序以增加100us的时间延时运行,再按"Ctrl + C"退出测试,串口终端将打印程序统计的延迟数据,如下图所示。

Target#./rt_gpio_ctrl -t 10 -d 100

图 39

同时使用示波器捕捉LED两次电平翻转之间的间隔,即可得到线程调度的延迟,测试点为R44电阻一端。

图 40

本次测得电平翻转周期为∆x = 108us,如下图所示。由于程序中默认增加了100us的时间延时,因此实际延时应为:108us - 100us = 8us,与程序统计打印的Latency results平均值相近。

图 41

执行如下命令,指定程序以增加0us的时间延时运行,再按"Ctrl + C"退出测试,串口终端将打印程序统计的延迟数据,如下图所示。

Target#./rt_gpio_ctrl -t 10 -d 0

图 42

同时使用示波器捕捉LED两次电平翻转之间的间隔,即可得到线程调度的延迟,测试点为R44电阻一端。本次测得电平翻转周期为∆x = 5.3us,如下图所示。既实际延时为:5.3us,与程序统计打印的Latency results平均值相近。

图 43

案例编译

将产品资料"4-软件资料\Demo\linux-rt-demos\rt_gpio_ctrl\"案例源码拷贝至Ubuntu。进入案例源码目录,执行如下命令,编译案例生成可执行文件。

Host# make CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++

图 44

关键代码

(1)创建实时任务,具体操作包括内存锁定、线程堆栈内存设置、调度策略和优先级配置等。

图 45

(2)在线程中打开LED文件节点,并对LED状态进行翻转。

图 46

(3)统计调度时间延时情况。

图 47

rt_input案例

案例说明

通过创建一个基本的实时线程,在线程内打开input设备,并对按键事件进行监听,然后触发LED的电平翻转,再通过示波器测量按键触发到LED电平翻转期间的实际耗时。程序原理大致如下:

(1)在Linux-RT内核上创建、使用实时线程。

(2)实时线程中对打开的input设备节点进行按键事件监听,通过判断监听得到的按键事件来触发LED的电平翻转。

案例测试

执行如下命令,查看用户输入按键对应的事件号。其中USER1(KEY2)对应的按键事件号为event0。

**Target#**cat /proc/bus/input/devices

图 48

将案例bin目录下的可执行文件拷贝至评估板文件系统,并执行如下命令运行测试程序。程序运行后按下USER1(KEY2)用户输入按键点亮LED,松开按键后LED熄灭,再按"Ctrl + C"退出测试程序。

Target#./rt_input /dev/input/event0

图 49

同时分别使用示波器探头1测量LED电路R44电阻一端,使用示波器探头2测量按键USER1(KEY2)引脚1。

图 50

图 51

从按键下降沿触发的开始(下图蓝线)到LED上升沿触发的完成(下图黄线)的时间间隔,即为系统实时捕获按键输入时间并响应触发LED电平翻转的时间∆x,从图中可看到∆x = 138us。

图 52

备注:在硬件特性上,由于按键电压由低电平上拉到高电平比较缓慢,因此本次测试实时事件的输入采用下降沿触发方式。

案例编译

将产品资料"4-软件资料\Demo\linux-rt-demos\rt_input\"案例源码拷贝至Ubuntu。进入案例源码目录,执行如下命令,编译案例生成可执行文件。

Host# make CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++

图 53

关键代码

(1)创建实时任务,具体操作包括内存锁定、线程的堆栈内存设置、调度策略和优先级配置等。

图 54

(2)在线程中打开input设备节点并监听按键事件,同时触发LED电平的翻转。

图 55

相关推荐
禅口魔心24 分钟前
RK3588硬件 Agent 代码详解
rk3588·嵌入式开发·硬件agent
禅口魔心3 小时前
RK3588(Rock 5T)硬件 Agent 搭建实录:从环境到跑通第一个闭环
rk3588·嵌入式开发
吾诺20 小时前
2026年进口高低压太贵国产替代|杭州之江选型
工业控制·国产替代·电气设备·高低压元器件·成套设备
Mr数据杨2 天前
【CanMV K210】硬件基础 面包板连通规则与无焊接电路搭建
人工智能·硬件开发·canmv k210
派勤电子3 天前
工控主板串口数量上限是多少?X86与ARM不同板型原生串口数量详情
嵌入式开发·工业控制·工业自动化·工控主板·arm主板·工控主板串口·x86主板串口
BW.SU3 天前
RUI Studio--嵌入式 UI 开发新范式
单片机·ui·嵌入式开发
dozenyaoyida3 天前
无外网 Linux 服务器离线安装 VS Code Remote-SSH 指南(新版双包机制 + commit 一致)
ssh·vs code·嵌入式开发·clangd·离线安装·remote-ssh
Tronlong创龙4 天前
告别系统崩溃!ARM工控机 + OverlayFS,系统一键还原
嵌入式开发·硬件开发·工业控制·工业开发板
俊基科技4 天前
AU-48 双麦多功能语音处理模组让每一句话都清晰抵达 —— 一颗 23×20mm 小芯片,重新定义“听得清“
嵌入式开发·硬件开发·ai降噪·回声消除·拾音降噪
Mr数据杨5 天前
【CanMV K210】系统环境 IDE 连接开发板与串口通信
人工智能·硬件开发·canmv k210