矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 1663|回复: 4

[通过AI学习编程]永远的编程新手小白向deepseek请教树莓派pico的PIO编程

[复制链接]
     
发表于 2025-2-13 10:43:05 | 显示全部楼层 |阅读模式
早上坐地铁,想起raspberry pi pico的PIO还有很多迷糊的地方,掏出手机问deepseek:
++++++++++++++++++++++++++++++++++++++++++++++++++++

问:同一个PIO的四个状态机可以运行不同的程序吗?
AI不仅告诉我能,而且告诉了我几个关键点,例如:

每个状态机可以加载不同的 PIO 程序。
四个状态机可以同时运行,互不干扰。
每个状态机可以处理不同的 I/O 任务,例如一个状态机控制 LED,另一个读取传感器数据。
状态机共享同一个 PIO 模块的指令内存(32 条指令)。
如果程序较短,多个状态机可以共享指令内存的不同部分。
每个状态机可以独立配置引脚映射、时钟分频等参数。
状态机之间的配置互不影响。
++++++++++++++++++++++++++++++++++++++++++++++++++++

让它举几个arduino下的编程例子,它举了几个,其中一个是这样的:
  1. #include <RP2040_PIO.h>

  2. // 定义 PIO 程序
  3. const uint16_t servo_program[] = {
  4.     0xe081, // set pindirs, 1
  5.     0xe001, // set pins, 1
  6.     0x6040, // mov x, osr
  7.     0x0042, // label high
  8.     0x0042, // jmp x--, high
  9.     0xe000, // set pins, 0
  10.     0x6040, // mov x, osr
  11.     0x0042, // label low
  12.     0x0042, // jmp x--, low
  13. };

  14. // 初始化 PIO
  15. RP2040_PIO pio;
  16. uint sm = 0;

  17. void setup() {
  18.     pio.begin();
  19.     sm = pio.addProgram(servo_program, sizeof(servo_program) / 2);
  20.     pio.setPins(sm, 0, 1); // 设置引脚 0 为输出
  21.     pio.start(sm);
  22. }

  23. void loop() {
  24.     // 设置伺服电机角度
  25.     pio.write(sm, 1500); // 1.5ms 脉冲,中间位置
  26.     delay(1000);
  27.     pio.write(sm, 1000); // 1.0ms 脉冲,最小角度
  28.     delay(1000);
  29.     pio.write(sm, 2000); // 2.0ms 脉冲,最大角度
  30.     delay(1000);
  31. }
复制代码

看不出啥毛病,估计可以直接c+v。
++++++++++++++++++++++++++++++++++++++++++++++++++++

看不懂pio.setPins()函数,并且不清楚把GPIO分配给PIO的SM的逻辑。继续问,它的回答:

pio.setPins() 函数用于配置状态机使用的 GPIO 引脚。它的主要作用是将一组连续的 GPIO 引脚分配给特定的状态机,以便状态机可以控制这些引脚或从这些引脚读取数据。
参数说明
sm: 状态机编号(0-3)。
pin_base: 起始 GPIO 引脚编号。
pin_count: 要分配的 GPIO 引脚数量。
is_out: 布尔值,表示这些引脚是用于输出(true)还是输入(false)。

很清楚。
++++++++++++++++++++++++++++++++++++++++++++++++++++

对pio.addProgram函数不解。这里面状态机居然不是用户指定的,而是系统自动分配的。于是继续问:
请说明一下sm = pio.addProgram()函数,并且说明一下为什么这里sm不是由用户指定的?

答:
自动管理状态机:

PIO 模块有两个 PIO 块,每个块有 4 个状态机(总共 8 个状态机)。

系统会自动管理这些状态机,确保每个状态机只加载一个程序,避免冲突。

简化用户操作:

用户不需要关心状态机的具体编号,系统会自动分配一个可用的状态机。

这样可以简化用户的操作,减少出错的可能性。

动态分配:

系统会根据当前状态机的使用情况动态分配一个空闲的状态机。

如果所有状态机都被占用,addProgram() 函数会返回一个错误或无效的状态机编号。
++++++++++++++++++++++++++++++++++++++++++++++++++++

进一步问如何编译PIO代码,给出的回答是pioasm工具,操作步骤也是一目了然的。

一路地铁下来,感觉基本上入门了。
如此强大的生成式大语言模型,据说其推理阶段的工作,简单点说,就是根据前面一大段话,综合在训练阶段它学到的“知识”,也即词汇之间的相关性,推理下一个字将会是什么。推理下一段话?不是的。只推理下一个字。要说它有智能,真是想多了。真是大力出奇迹。

评分

1

查看全部评分

     
发表于 2025-2-13 11:54:10 | 显示全部楼层
俺给当前的 AI 总结了一个八字方针:博闻强记、模式识别

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2025-2-23 21:29:39 | 显示全部楼层
目前的AI只会到处找解答,然后组合,漏洞百出...找不到解答长时间五响应...

AI炒作价值远远高于实用价值,起码目前如此。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2025-2-23 22:14:49 | 显示全部楼层
chipset009 发表于 2025-2-23 21:29
目前的AI只会到处找解答,然后组合,漏洞百出...找不到解答长时间五响应...

AI炒作价值远远高于实用价值 ...

好像你理解有误。生成式LLM的算法不是根据你的提问找解答。而是根据概率模型和神经网络,根据你敲的字,判断后面该输出什么字。而且是一个字一个字生成出来的。只要算力在,就可以输出,不存在“找不到解答”这回事。
回复 支持 反对

使用道具 举报

发表于 2025-2-24 19:40:47 | 显示全部楼层
量子隧道 发表于 2025-2-23 22:14
好像你理解有误。生成式LLM的算法不是根据你的提问找解答。而是根据概率模型和神经网络,根据你敲的字, ...

很容易验证。

下个离线版,把本地缓存清理了,本地数据库锁了,网也断了,然后问几个问题就知道了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-30 07:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表