当前位置:首页 > EDA > 电子设计自动化
[导读]做产品别把裸机和Linux对立。低成本传感、电机微环、开机自检用裸机C;多协议、联网、日志、可视化放Linux;中间用设备树和统一数据模型衔接,既保实时又保可维护。


做产品别把裸机和Linux对立。低成本传感、电机微环、开机自检用裸机C;多协议、联网、日志、可视化放Linux;中间用设备树和统一数据模型衔接,既保实时又保可维护。

一、裸机C:寄存器与最小驱动

裸机核心是“时钟—引脚—外设—中断”四步。以UART上报传感器为例,直接映射寄存器,少用第三方库:

#define UART_BASE 0x40013800u

#define UART_SR   (*(volatile uint32_t*)(UART_BASE+0x00))

#define UART_DR   (*(volatile uint32_t*)(UART_BASE+0x04))

#define GPIOA_ODR (*(volatile uint32_t*)0x4001080Cu)


void uart_send(uint8_t c){

   while(!(UART_SR & (1u<<7)));   // TXE等待

   UART_DR = c;

}

void adc_report(void){

   uint16_t v = read_adc(1);      // 自行实现ADC采样

   char buf[16]; int n=sprintf(buf,"v=%u\r\n",v);

   for(int i=0;i<n;i++) uart_send((uint8_t)buf[i]);

}

裸机主循环用状态机,硬实时用定时器+ISR,ISR只置标志、入环形缓冲,不调printf长逻辑。资源紧就静态数组、固定队列,避免malloc碎片。

二、Linux设备树:把硬件信息外置

SoC换成ARM Linux后,硬件资源不写死在驱动里,改用DTS描述,驱动通过compatible匹配、reg取地址、irq取中断:

sensor0: adc_ctrl@40000000{

   compatible = "vendor,adc-ctrl";

   reg = <0x40000000 0x1000>;

   interrupts = <0 18 4>;

   clock-frequency = <84000000>;

   status = "okay";

};

驱动probe里解析并ioremap,注册字符设备供应用层read:

static struct platform_driver adc_plat = {

   .probe = adc_probe,

   .remove = adc_remove,

   .driver = { .name="adc-ctrl",

       .of_match_table = of_match_ptr(adc_of[]) },

};

static const struct of_device_id adc_of[] = {

   { .compatible="vendor,adc-ctrl" }, { }

};

static ssize_t adc_read(struct file *f,char __user *u,size_t n,loff_t *o){

   uint32_t val=readl(base+0x00);

   char b[12]; int k=sprintf(b,"%u",val);

   if(n>k)k=n; copy_to_user(u,b,k); return k;

}

resource用platform_get_resource取reg,devm_ioremap_resource映射;中断用devm_request_irq,数据就绪再wake_up,应用read阻塞等待,不轮询烧CPU。

三、应用层:采集、归一、上云

Linux应用不碰寄存器,只open("/dev/adc0"),按统一点位模型转MQTT/Influx:

int fd=open("/dev/adc0",O_RDONLY);

char buf[32]; float scale=0.001;

while(run){

   int n=read(fd,buf,sizeof(buf)); buf[n>0?n:0]=0;

   float v=atof(buf)*scale;

   char body[64]; sprintf(body,"{\"adc\":%.3f}",v);

   mqtt_publish("dev/adc0",body,1);   // Paho/QoS1

   usleep(100000);

}

多设备用JSON点表配置:设备名、驱动节点、scale、周期、MQTT主题;新增传感器只改DTS+点表,应用和云平台不变。断网本地落SQLite,恢复按ts补传。

四、产品落地边界

实时分层:微秒/亚毫秒闭环、看门狗、急停留裸机或RTOS/PL;秒级采发、协议转换、Web走Linux。

启动衔接:Bootloader→内核→设备树→根文件系统;裸机自检可放SPL/UBOOT前段,硬件故障早报错。

调试分工:裸机用逻辑分析仪、串口、ITM;Linux用dmesg、devmem、i2cdetect、perf;应用用日志和Prometheus指标。

可维护性:驱动按platform+子系统写,GPIO走pinctrl、I2C/SPI走对应框架,避免直接裸写映射地址;应用容器或systemd服务化,配置外置。

量产注意:设备树按板版本分支,驱动签名/模块版本锁定,点表做权限控制,OTA分boot、kernel、dtb、app四包回滚。

按“裸机C管底层实时与启动、设备树管硬件解耦、Linux驱动管标准接口、应用层管采集上云与可视化”推进,从传感器样机到工业网关产品都能复用同一套分层,改硬件不改业务、改业务不碰寄存器。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭