- Linux线上函数查询网站:https://pubs.opengroup.org/onlinepubs/9699919799/
一 Linux 信号
1.1 Linux 异步通知
通过异步通知信号来结束相应进程,如kill -15 xxx
、Ctrl + C
来结束响应进程。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <stdatomic.h>
// 全局标志位
atomic_int signal_received = 0;
// 信号处理函数
void signal_handler(int signum) {
// 设置标志位;在APP中关闭资源后推出进程
signal_received = signum;
// exit(0); // 使用 exit 或 __exit 会在该函数结束后直接退出进程
}
int main(int argc, char *argv[]) {
// 注册信号处理函数
signal(SIGTERM, signal_handler); // 捕获 SIGTERM(信号 15)
signal(SIGINT, signal_handler); // 捕获 SIGINT(信号 2,Ctrl+C)
// 模拟程序运行
while (1) {
// 检查标志位
if (signal_received != 0) {
printf("Received signal %d, cleaning up...\n", signal_received);
// 执行清理操作
// 1. 关闭文件
// 2. 关闭 TCP 连接
// 3. 释放资源
// ...
printf("Cleanup complete, exiting...\n");
break; // 退出循环
}
// 模拟程序工作
printf("Running...\n");
sleep(1);
}
return 0;
}
二、CAN 参数
root@E2100:/# ip -details link show can1
3: can1: <NOARP,ECHO> mtu 72 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 10
link/can promiscuity 0 allmulti 0 minmtu 0 maxmtu 0
can <FD> state STOPPED (berr-counter tx 0 rx 0) restart-ms 0
bitrate 1003102 sample-point 0.744
tq 10 prop-seg 36 phase-seg1 36 phase-seg2 25 sjw 1 brp 2
rk3576_canfd: tseg1 1..128 tseg2 1..128 sjw 1..128 brp 1..256 brp_inc 2
dbitrate 2006204 dsample-point 0.714
dtq 71 dprop-seg 2 dphase-seg1 2 dphase-seg2 2 dsjw 1 dbrp 14
rk3576_canfd: dtseg1 1..32 dtseg2 1..16 dsjw 1..16 dbrp 1..256 dbrp_inc 2
clock 196608000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 tso_max_size 65536 tso_max_segs 65535 gro_max_size 65536 parentbus platform parentdev ff330000.can
`` tq 10 prop-seg 36 phase-seg1 36 phase-seg2 25 sjw 1 brp 2 ``
`` 波特率 = clock / (seg + seg1 + seg2 + sjw) / brp ``
`` 可以参考STM32F4数据手册 24.7.7 章节 ``
CAN 控制器时钟(如 196.608 MHz)需分频生成目标波特率,但分频系数必须为整数。
网络配置:
eth2exists=$(ls /sys/class/net | grep -w "eth2")
if [ -n "$eth2exists" ]; then
ifconfig eth0 192.168.3.30
ifconfig eth1 192.168.1.30
ifconfig eth2 192.168.2.30
echo "eth2 exist ; set ip addr 192.168.3.30"
else
ifconfig eth0 192.168.1.30
ifconfig eth1 192.168.2.30
echo "eth2 not exist"
fi