Linux通过SPI采集AD数据问题

roxsun 2017-07-22 07:47:07
Linux用的4.1的内核,芯片是iMX6Q,AD用的是TI的ADS1178,52Ksps的采样率。
作为初学者,我一开始的想法用的系统自带的spi、gpio驱动,使用ADS1178的dataready信号作为GPIO外部中断信号,用户态用poll监测gpio中断然后再read AD的数据,试了下发现根本无法快速响应52K的采样率。
后来我想了想是不是只能编写AD驱动在内核进行数据采集,不知道这样能不能保证AD数据不丢,即外部中断到达后的20us内要用SPI读完几十个字节,SPI操作是不是不能在驱动gpio外部中断函数内进行?如果不能,是不是很难保证数据不丢?
希望大神们能给个思路。。。
...全文
1134 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Acuity. 2017-10-10
  • 打赏
  • 举报
回复
1、开个fifo,先读回数据再处理; 2、多线程,一个处理线程一个读AD线程; 3、以上,足以。
weixin_40500893 2017-10-09
  • 打赏
  • 举报
回复
和rt无关,上fifo --Linux星球
roxsun 2017-07-27
  • 打赏
  • 举报
回复
引用 3 楼 jklinux 的回复:
[quote=引用 2 楼 roxsun 的回复:] [quote=引用 1 楼 jklinux 的回复:] 你在应用程序这边通过调用设备驱动的方式来操作太慢了,因用户进程需要从用户态到内核态,操作完成后又要从内核态返回到用户态,这个过程太耗时了。你需要写spi设备驱动来完成ad采集,用户程序只需要结果就可以了
试了下发现50kHz的外部中断根本响应不过来,做了个测试,关了中断调度,把以太网中断什么的都绑定到其他核,只是在驱动中断函数里计数同时schedule_work,work_queue里也只是计数,发现大概每10万个中断响应,work_queue少执行了100次左右。。。work_queue里这都还没做SPI读操作。。。 Linux实时性果然不行,看来只能老老实实换方案了。。。[/quote] linux系统的实时性确实不怎样,但几十微秒还是处理得来才对哦, 在中断和工作队列里没有调用printk吧? printk应是从串口输出非常耗时的。还有某些方案的外部中断控制器里需要配置使用高频率的时钟源信号才可不会丢失中断,如全志的h3. [/quote] 计数到十万次才调用一次printk。。。后来看到有人四个核一个核裸奔或者上rtos,其他三个核Linux,但是对我来说难度太大了。老老实实上FPGA加ARM了。
publicshy 2017-07-27
  • 打赏
  • 举报
回复
使用rtos吧
zgl7903 2017-07-26
  • 打赏
  • 举报
回复
一般高实时性/大数据量的推荐由硬件(MCU/DSP/CPLD/FPGA) 来完成
jklinux 2017-07-25
  • 打赏
  • 举报
回复
引用 2 楼 roxsun 的回复:
[quote=引用 1 楼 jklinux 的回复:] 你在应用程序这边通过调用设备驱动的方式来操作太慢了,因用户进程需要从用户态到内核态,操作完成后又要从内核态返回到用户态,这个过程太耗时了。你需要写spi设备驱动来完成ad采集,用户程序只需要结果就可以了
试了下发现50kHz的外部中断根本响应不过来,做了个测试,关了中断调度,把以太网中断什么的都绑定到其他核,只是在驱动中断函数里计数同时schedule_work,work_queue里也只是计数,发现大概每10万个中断响应,work_queue少执行了100次左右。。。work_queue里这都还没做SPI读操作。。。 Linux实时性果然不行,看来只能老老实实换方案了。。。[/quote] linux系统的实时性确实不怎样,但几十微秒还是处理得来才对哦, 在中断和工作队列里没有调用printk吧? printk应是从串口输出非常耗时的。还有某些方案的外部中断控制器里需要配置使用高频率的时钟源信号才可不会丢失中断,如全志的h3.
roxsun 2017-07-25
  • 打赏
  • 举报
回复
引用 1 楼 jklinux 的回复:
你在应用程序这边通过调用设备驱动的方式来操作太慢了,因用户进程需要从用户态到内核态,操作完成后又要从内核态返回到用户态,这个过程太耗时了。你需要写spi设备驱动来完成ad采集,用户程序只需要结果就可以了
试了下发现50kHz的外部中断根本响应不过来,做了个测试,关了中断调度,把以太网中断什么的都绑定到其他核,只是在驱动中断函数里计数同时schedule_work,work_queue里也只是计数,发现大概每10万个中断响应,work_queue少执行了100次左右。。。work_queue里这都还没做SPI读操作。。。 Linux实时性果然不行,看来只能老老实实换方案了。。。
jklinux 2017-07-24
  • 打赏
  • 举报
回复
你在应用程序这边通过调用设备驱动的方式来操作太慢了,因用户进程需要从用户态到内核态,操作完成后又要从内核态返回到用户态,这个过程太耗时了。你需要写spi设备驱动来完成ad采集,用户程序只需要结果就可以了

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧