搜索
bottom↓
回复: 52

尝试用全志linux开发板点个LED灯

[复制链接]

出0入0汤圆

发表于 2025-1-14 15:41:01 | 显示全部楼层 |阅读模式
本帖最后由 887799 于 2025-1-14 15:45 编辑

借此感谢论坛各位大佬的无私帮助!

全志的T113S3开发板买回来好几天了,小白的学习先从点个LED灯开始. 上网一顿搜,用脚本来一个点灯操作,看一下这几天的学习成果.
#!/bin/bash
GPIO=199
echo $GPIO > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio$GPIO/direction
#for i in {1..10}; do
#for (i=1; i<=10; i++); do
for i in $(seq 1 10); do
    echo 0 > /sys/class/gpio/gpio$GPIO/value
    sleep 2  # 保持2秒
    echo 1 > /sys/class/gpio/gpio$GPIO/value
    sleep 2  # 保持2秒
done
echo $GPIO  > /sys/class/gpio/unexport
灯是闪起来了,就是有点费脑. 接下来要倒腾下 应用c程序点LED.
感觉用VSCODE 来开发linux还不错,用adb 下传程序到开发板比较方便. linux上的vi用不习惯,太难用了.

阿莫论坛21周年了!感谢大家的支持与爱护!!

“战争只是一群老头的政治游戏,可冲上去的却是一群年轻人,战争结束后,资本家满载而归,政客握手言和,只有母亲抱着墓碑哭泣!”

出0入9汤圆

发表于 2025-1-14 15:55:18 | 显示全部楼层
与C/C++有区别,不习惯!

出0入162汤圆

发表于 2025-1-14 15:58:11 来自手机 | 显示全部楼层
用golang开发,爽翻天,珍爱生命,远离C艹

出0入0汤圆

 楼主| 发表于 2025-1-14 16:06:07 | 显示全部楼层
在开发板上找到一个 点灯的C程序 ,下到开发板上验证这个程序可以点led灯.
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>

int main(int argc, char **argv)
{
    int fd;
    char led_on = 0, led_off = 1;

    fd = open("/dev/led", O_RDWR);
    if (fd < 0)
    {
        perror("open usr led error\n");
    }
    while (1)
    {
        write(fd, &led_on, 1);
        sleep(2);
        write(fd, &led_off, 1);
        sleep(2);
    }
    return 0;
}

出0入0汤圆

 楼主| 发表于 2025-1-14 16:07:59 | 显示全部楼层
本帖最后由 887799 于 2025-1-14 16:16 编辑
redworlf007 发表于 2025-1-14 15:58
用golang开发,爽翻天,珍爱生命,远离C艹
(引用自3楼)


大佬, 这个开发板上用的这个编译器 gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux, 是不是不能运行go??
golang开发是不是与linux 编译环境有关?

出0入213汤圆

发表于 2025-1-14 16:40:59 | 显示全部楼层
887799 发表于 2025-1-14 16:07
大佬, 这个开发板上用的这个编译器 gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt- ...
(引用自5楼)

可以用的,环境变量设置一下直接在windows下编译。

set GOOS=linux
set GOARCH=arm
go build -o app -ldflags "-s -w"

出0入162汤圆

发表于 2025-1-14 16:55:08 来自手机 | 显示全部楼层
887799 发表于 2025-1-14 16:07
大佬, 这个开发板上用的这个编译器 gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt- ...
(引用自5楼)

你看楼上,go开发在Windows上,不需要Linux虚拟机啥的 。

出0入0汤圆

 楼主| 发表于 2025-1-14 17:22:55 | 显示全部楼层
vtte 发表于 2025-1-14 16:40
可以用的,环境变量设置一下直接在windows下编译。

set GOOS=linux
(引用自6楼)

只是vscode上安装go插件就行了么? windows上是否要安装 go 环境?

出0入0汤圆

 楼主| 发表于 2025-1-14 17:23:09 | 显示全部楼层
redworlf007 发表于 2025-1-14 16:55
你看楼上,go开发在Windows上,不需要Linux虚拟机啥的 。
(引用自7楼)

只是vscode上安装go插件就行了么? windows上是否要安装 go 环境?

出0入162汤圆

发表于 2025-1-14 19:57:47 来自手机 | 显示全部楼层
887799 发表于 2025-1-14 17:23
只是vscode上安装go插件就行了么? windows上是否要安装 go 环境?
(引用自9楼)

下载golang的安装包装到Windows上。

出0入0汤圆

 楼主| 发表于 2025-1-14 20:23:36 | 显示全部楼层
redworlf007 发表于 2025-1-14 19:57
下载golang的安装包装到Windows上。
(引用自10楼)

下载了,可以在windows 环境下执行编译后的文件.但是这个文件在VM LINUX 和 开发板上都不可以运行,不知为什么原因?
以下是hello.go源码
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}
以下是要在电脑linux 下运行的 Makefile 内容
build:
        @set GOOS=linux GOARCH=amd64 go build -o hello  hello.go

执行make 没有提示错误, 把这个文件 hello 放到linux 下无法运行,提示:
>./hello
bash: ./hello: 无法执行二进制文件: 可执行文件格式错误

出0入1119汤圆

发表于 2025-1-14 20:32:57 | 显示全部楼层
887799 发表于 2025-1-14 20:23
下载了,可以在windows 环境下执行编译后的文件.但是这个文件在VM LINUX 和 开发板上都不可以运行,不知为 ...
(引用自11楼)

GOARCH=arm GOARM=7

出0入0汤圆

发表于 2025-1-14 21:22:31 来自手机 | 显示全部楼层
全智的芯片。linux下可以用adb吗?安卓下面才可以用a db吧?

出0入0汤圆

 楼主| 发表于 2025-1-14 22:01:07 | 显示全部楼层

多谢提醒! 在一番胡乱操作下,以及ai 的帮忙,给出以下的代码,可以运行在 全志的开发板上了,LED 灯闪起来了.
不过感觉,这个代码不比 linux shell 脚本内容少,

package main

import (
    "fmt"
    "os"
    "strconv"
    "time"
)

// GPIO引脚编号,需要根据实际情况替换
const gpioPin = 199  

// LED控制路径作为函数返回值,以确保它们在运行时可以正确构建
func getGPIOPaths() (string, string, string, string) {
    pinStr := strconv.Itoa(gpioPin)
    return "/sys/class/gpio/export",
           "/sys/class/gpio/unexport",
           "/sys/class/gpio/gpio" + pinStr + "/direction",
           "/sys/class/gpio/gpio" + pinStr + "/value"
}

func writeGPIO(path string, value string) error {
    file, err := os.OpenFile(path, os.O_WRONLY, 0666)
    if err != nil {
        return err
    }
    defer file.Close()

    _, err = file.WriteString(value)
    return err
}

func setupGPIO(exportPath, directionPath string) error {
    // 导出GPIO引脚
    if err := writeGPIO(exportPath, strconv.Itoa(gpioPin)); err != nil {
        return fmt.Errorf("导出GPIO失败: %v", err)
    }

    // 等待一段时间确保GPIO被正确设置
    time.Sleep(100 * time.Millisecond)

    // 设置为输出模式
    if err := writeGPIO(directionPath, "out"); err != nil {
        return fmt.Errorf("设置GPIO方向失败: %v", err)
    }

    return nil
}

func cleanupGPIO(unexportPath string) error {
    // 取消导出GPIO引脚
    return writeGPIO(unexportPath, strconv.Itoa(gpioPin))
}

func toggleLED(on bool, valuePath string) error {
    var value string
    if on {
        value = "1"
    } else {
        value = "0"
    }
    return writeGPIO(valuePath, value)
}

func main() {
    exportPath, unexportPath, directionPath, valuePath := getGPIOPaths()

    // 设置GPIO
    if err := setupGPIO(exportPath, directionPath); err != nil {
        fmt.Println(err)
        return
    }
    defer cleanupGPIO(unexportPath)

    // 循环10次
    for i := 0; i < 10; i++ {
        // 开启LED灯
        if err := toggleLED(true, valuePath); err != nil {
            fmt.Println("开启LED失败:", err)
            continue
        }

        // 延时2秒
        time.Sleep(2 * time.Second)

        // 关闭LED灯
        if err := toggleLED(false, valuePath); err != nil {
            fmt.Println("关闭LED失败:", err)
            continue
        }

        // 再次延时2秒,以便可以看到LED关闭的效果
        time.Sleep(2 * time.Second)
    }
}

出0入0汤圆

 楼主| 发表于 2025-1-14 22:17:30 | 显示全部楼层
本帖最后由 887799 于 2025-1-14 22:20 编辑
liuzhijun2008 发表于 2025-1-14 21:22
全智的芯片。linux下可以用adb吗?安卓下面才可以用a db吧?
(引用自13楼)


我是在VM 的linux安装adb ,这样linux 编译完成的软件可以通过ADB 命令下载到 开发板.

出0入213汤圆

发表于 2025-1-14 22:25:56 来自手机 | 显示全部楼层
887799 发表于 2025-1-14 20:23
下载了,可以在windows 环境下执行编译后的文件.但是这个文件在VM LINUX 和 开发板上都不可以运行,不知为 ...
(引用自11楼)

GOARCH=amd64  这里不对,你的目标系统不是64位的。

出0入0汤圆

 楼主| 发表于 2025-1-14 22:28:51 | 显示全部楼层
vtte 发表于 2025-1-14 22:25
GOARCH=amd64  这里不对,你的目标系统不是64位的。
(引用自16楼)

多谢大佬提点, 现在go编译的程序可以运行在开发板上点LED了, 只是感觉go 语言也不比 C 和 linux shell 简洁呀, 是不是哪里不对?

出0入9汤圆

发表于 2025-1-14 22:39:37 | 显示全部楼层
哪位大师可出个简易入门教程就好了

出0入213汤圆

发表于 2025-1-14 22:53:07 来自手机 | 显示全部楼层
887799 发表于 2025-1-14 22:28
多谢大佬提点, 现在go编译的程序可以运行在开发板上点LED了, 只是感觉go 语言也不比 C 和 linux shell 简 ...
(引用自17楼)

哈哈,等你要用到很多第三方库的时候就知道了,你让C用https获取一个json并解析试下😁
我当年搞交叉编译,依赖库简直让人疯掉😓

出0入162汤圆

发表于 2025-1-15 01:09:40 来自手机 | 显示全部楼层
Firman 发表于 2025-1-14 22:39
哪位大师可出个简易入门教程就好了
(引用自18楼)

大哥,go有很多轮子,不依赖目标机的编译器,对我这种菜鸡,只要学会复制粘贴,就能搞项目了。

出0入0汤圆

发表于 2025-1-15 11:24:16 | 显示全部楼层
redworlf007 发表于 2025-1-15 01:09
大哥,go有很多轮子,不依赖目标机的编译器,对我这种菜鸡,只要学会复制粘贴,就能搞项目了。 ...
(引用自20楼)

go语言编译出来的可执行程序体积和内存占用都很大吧?全志这种小CPU上用起来还是有点重量级吧?

出0入213汤圆

发表于 2025-1-15 11:30:31 | 显示全部楼层
meirenai 发表于 2025-1-15 11:24
go语言编译出来的可执行程序体积和内存占用都很大吧?全志这种小CPU上用起来还是有点重量级吧? ...
(引用自21楼)

程序体积相对于嵌入式来说是偏大,内存占用不会特别大,但因为语言特性,GC功能会占用一些内存。 我在64MB内存,16MB ROM的mips处理器上照样跑得很欢。

出0入162汤圆

发表于 2025-1-15 11:35:03 来自手机 | 显示全部楼层
meirenai 发表于 2025-1-15 11:24
go语言编译出来的可执行程序体积和内存占用都很大吧?全志这种小CPU上用起来还是有点重量级吧? ...
(引用自21楼)

现在的片子随便64M ddr,nand更不值钱,大一点没事的。

出0入233汤圆

发表于 2025-1-15 12:16:50 | 显示全部楼层
我也用T113,要不是为了用硬件解码,我都想用c#开发linux应用了,之前在树莓派上面用c#,很爽。

出150入321汤圆

发表于 2025-1-15 12:35:15 | 显示全部楼层
redworlf007 发表于 2025-1-15 01:09
大哥,go有很多轮子,不依赖目标机的编译器,对我这种菜鸡,只要学会复制粘贴,就能搞项目了。 ...
(引用自20楼)

linux驱动go能搞定么,还是只是应用

出0入0汤圆

发表于 2025-1-15 12:47:42 | 显示全部楼层
akey3000 发表于 2025-1-15 12:35
linux驱动go能搞定么,还是只是应用
(引用自25楼)

只有应用,驱动智能用C,现在rust也能稍微一战。

出0入162汤圆

发表于 2025-1-15 14:14:49 来自手机 | 显示全部楼层
akey3000 发表于 2025-1-15 12:35
linux驱动go能搞定么,还是只是应用
(引用自25楼)

大哥,驱动不行,应用程序可以。现在基本上不用自己写啥驱动,基本是应用程序。

出0入135汤圆

发表于 2025-1-15 14:36:35 | 显示全部楼层
我教你一招,你搜索一下wsl2的安装方式,在wsl2下面的ubuntu开发linux程序,爽的一批。

vm虚拟机卡顿,分辨率字体大小各种难受,我尝试了一下放弃了。

Linux实体也不行,windows的软件离开不了。

我现在主要使用wsl2+vscode

vscode左下角有个连接按钮,直接连上wsl2,开发就像本地开发一样

出0入0汤圆

 楼主| 发表于 2025-1-15 14:58:02 | 显示全部楼层
asj1989 发表于 2025-1-15 14:36
我教你一招,你搜索一下wsl2的安装方式,在wsl2下面的ubuntu开发linux程序,爽的一批。

vm虚拟机卡顿,分 ...
(引用自28楼)


我的是老电脑装的WIN7,可以用你说的方法么?  是不是用win10才可以? 现在我用VSCODE 远程LINUX来操作.

出0入228汤圆

发表于 2025-1-15 16:51:21 | 显示全部楼层
学好GO ,就能号称嵌入开发啦,方便装B,

人家问你 能开发几个平台,你就说:随便什么系统 ,全能
win,   linux,openwrt,  osx,  android
不管性能的话,还能用tinygo  写mcu上的程序 。

再问需要什么硬件平台呢? 你答:随便
电脑 也行,路由器也行,树莓派也行,linux开发板也行,手机也行,平板也行,你想用哪个就用哪个

一邦伪专家马上在你面前就低头哈腰了

出0入90汤圆

发表于 2025-1-15 16:58:56 | 显示全部楼层
wxws 发表于 2025-1-15 16:51
学好GO ,就能号称嵌入开发啦,方便装B,

人家问你 能开发几个平台,你就说:随便什么系统 ,全能
(引用自30楼)

能过HR那关,但是过不了我这关!!!!!

出0入228汤圆

发表于 2025-1-15 17:03:48 | 显示全部楼层
honami520 发表于 2025-1-15 16:58
能过HR那关,但是过不了我这关!!!!!
(引用自31楼)

同业相仇 呀

咱们可是要一至 对付HR, 对付 甲方专家的

出0入14汤圆

发表于 2025-1-16 01:21:55 | 显示全部楼层
wxws 发表于 2025-1-15 16:51
学好GO ,就能号称嵌入开发啦,方便装B,

人家问你 能开发几个平台,你就说:随便什么系统 ,全能
(引用自30楼)

来搞个RAM 20K STM8试试 操作下IO脚硬解UART,会不会头大

出0入228汤圆

发表于 2025-1-16 08:07:04 | 显示全部楼层
本帖最后由 wxws 于 2025-1-16 08:08 编辑
isakura 发表于 2025-1-16 01:21
来搞个RAM 20K STM8试试 操作下IO脚硬解UART,会不会头大
(引用自33楼)


支持的mcu在这,虽然我也没怎么玩过:
https://tinygo.org/docs/reference/microcontrollers/

你应该将问题 改为软解uart.  硬解都是mcu自动的

出0入0汤圆

发表于 2025-1-16 18:05:57 | 显示全部楼层
wxws 发表于 2025-1-16 08:07
支持的mcu在这,虽然我也没怎么玩过:
https://tinygo.org/docs/reference/microcontrollers/

(引用自34楼)

归结为奇技淫巧,等财务自由再搞一搞。

出0入328汤圆

发表于 2025-1-16 18:33:02 来自手机 | 显示全部楼层
wxws 发表于 2025-1-16 08:07
支持的mcu在这,虽然我也没怎么玩过:
https://tinygo.org/docs/reference/microcontrollers/


(引用自34楼)

这个我测过,坑不少,譬如某些操作异常缓慢,可能跟内存分配或者gc相关。反而 Rust 就稳很多,甚至觉得比 C 都稳

出0入115汤圆

发表于 2025-1-17 15:42:27 | 显示全部楼层
yplin27 发表于 2025-1-16 18:33
这个我测过,坑不少,譬如某些操作异常缓慢,可能跟内存分配或者gc相关。反而 Rust 就稳很多,甚至觉得比 ...
(引用自36楼)

rust编译层就检测内存是否溢出了,所以要比c少奔放

出0入0汤圆

发表于 2025-1-17 16:13:00 | 显示全部楼层
嵌入式平台,go 有什么GUI 框架吗。

出0入162汤圆

发表于 2025-1-17 16:28:50 来自手机 | 显示全部楼层
zhangling520 发表于 2025-1-17 16:13
嵌入式平台,go 有什么GUI 框架吗。
(引用自38楼)

web前端技术

出0入0汤圆

发表于 2025-1-17 16:31:46 | 显示全部楼层

低端芯片跑不起浏览器内核啊

出0入162汤圆

发表于 2025-1-17 16:40:56 来自手机 | 显示全部楼层
zhangling520 发表于 2025-1-17 16:31
低端芯片跑不起浏览器内核啊
(引用自40楼)

go有个gui库的 ,不知道嵌入式上能不能跑,没试过。

出0入115汤圆

发表于 2025-1-17 23:28:23 来自手机 | 显示全部楼层
我目前在嵌入式开发喜欢用qt,qt虽然c++,但是实际使用起来基本没有c++那种难用感觉,qt的类很好很强大比c好用多了,唯一缺点就是库比较大,而且编译这个库会有点麻烦。

出0入162汤圆

发表于 2025-1-17 23:56:46 来自手机 | 显示全部楼层
三年模拟 发表于 2025-1-17 23:28
我目前在嵌入式开发喜欢用qt,qt虽然c++,但是实际使用起来基本没有c++那种难用感觉,qt的类很好很强大比c好 ...
(引用自42楼)


就是编译库,特别麻烦。我现在用串口屏。

出5入16汤圆

发表于 2025-4-4 20:53:54 来自手机 | 显示全部楼层
谁有f1c200s 的Tina3.5?

出0入0汤圆

 楼主| 发表于 2025-5-29 12:00:28 | 显示全部楼层
换个姿式继续点灯,  LVGL9  触摸 开关 控制LED.
  1. #include <unistd.h>
  2. #include <pthread.h>
  3. #include <time.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>

  6. #include "lvgl/lvgl.h"
  7. #include "lvgl/src/core/lv_global.h"

  8. #define GPIO_PIN "199" // 假设控制的 GPIO 引脚编号为 PG7
  9. #define GPIO_PATH "/sys/class/gpio/gpio" GPIO_PIN

  10. lv_obj_t * switch1;

  11. //---------- 初始化 GPIO 引脚
  12. void init_gpio(void) {
  13.     // 导出 GPIO 引脚
  14.     FILE *fp = fopen("/sys/class/gpio/export", "w");
  15.     if (fp) {
  16.         fprintf(fp, "%s", GPIO_PIN);
  17.         fclose(fp);
  18.     }
  19.    
  20.     // 设置 GPIO 引脚为输出模式
  21.     fp = fopen(GPIO_PATH "/direction", "w");
  22.     if (fp) {
  23.         fprintf(fp, "out");
  24.         fclose(fp);
  25.     }
  26. }

  27. //----------- 设置 GPIO 引脚的电平
  28. void set_gpio_level(bool level) {
  29.     FILE *fp = fopen(GPIO_PATH "/value", "w");
  30.     if (fp) {
  31.         fprintf(fp, "%d", level ? 1 : 0);
  32.         fclose(fp);
  33.     }
  34. }

  35. //-------- 定义事件回调函数
  36. void switch_event_cb(lv_event_t * e) {
  37.     bool is_on = lv_obj_has_state(switch1, LV_STATE_CHECKED);
  38.     printf("LED %s \n",is_on?"ON":"OFF");
  39.     set_gpio_level(!is_on); // GPIO 低电平为 ON
  40. }

  41. //-----------------------------------------
  42. static void lv_linux_disp_init(void)
  43. {
  44.     const char *device = "/dev/fb0";// LCD
  45.     lv_display_t * disp = lv_linux_fbdev_create();

  46.     //lv_linux_init_input_pointer(disp);
  47.     lv_indev_t *touch = lv_evdev_create(LV_INDEV_TYPE_POINTER, "/dev/input/event1");
  48.     lv_indev_set_display(touch, disp);

  49.     lv_linux_fbdev_set_file(disp, device);
  50. }

  51. //------------------------------------------------------
  52. void lv_linux_run_loop(void)
  53. {
  54.     uint32_t idle_time;

  55.     /*Handle LVGL tasks*/
  56.     while(1) {

  57.         idle_time = lv_timer_handler(); /*Returns the time to the next timer execution*/
  58.         usleep(idle_time * 1000);
  59.     }
  60. }

  61. //--------------------------------------------------------
  62. int main(int argc, char **argv)
  63. {
  64.    
  65.   /* Initialize LVGL. */
  66.   lv_init();

  67.   /* Initialize the configured backend SDL2, FBDEV, libDRM or wayland */
  68.   lv_linux_disp_init();
  69.      
  70. // 创建父容器
  71.   lv_obj_t * parent = lv_obj_create(lv_scr_act());
  72.   lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_COLUMN); // 设置为垂直布局
  73.   lv_obj_set_flex_align(parent, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
  74.   lv_obj_set_size(parent, 1024, 400);

  75. // 创建一个新的样式
  76.   static lv_style_t style_border;
  77.   lv_style_init(&style_border);

  78. // 设置边框宽度
  79.   lv_style_set_border_width(&style_border, 1); // 设置边框宽度为1像素

  80. // 设置边框颜色
  81.   lv_style_set_border_color(&style_border, lv_color_hex(0xff0000));//红色
  82.   lv_obj_add_style(parent, &style_border, LV_PART_MAIN);

  83. // 创建
  84.   switch1 = lv_switch_create(parent);
  85.   lv_obj_set_size(switch1, 200, 100);
  86.   lv_obj_add_event_cb(switch1, switch_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
  87.   lv_obj_add_style(switch1, &style_border, LV_PART_MAIN);
  88.      
  89.   init_gpio();

  90.   lv_linux_run_loop();

  91.   return 0;
  92. }
复制代码

出715入1076汤圆

发表于 2025-5-29 12:41:13 来自手机 | 显示全部楼层
读写 /sys/class/gpio/export 系列文件操作 gpio 已经过时了,新内核已经不再支持了

现在一般是用 gpiod 这个库操作 gpio,譬如:

https://github.com/dukelec/cdnet ... cdctl_spi_wrapper.c


或者直接 ioctl 操作 /dev/gpiochip0

出0入0汤圆

发表于 2025-5-29 14:21:28 | 显示全部楼层
dukelec 发表于 2025-5-29 12:41
读写 /sys/class/gpio/export 系列文件操作 gpio 已经过时了,新内核已经不再支持了

现在一般是用 gpiod  ...
(引用自46楼)

这么快就噩耗来了 ?

出0入942汤圆

发表于 2025-5-29 17:35:52 | 显示全部楼层
yplin27 发表于 2025-1-16 18:33
这个我测过,坑不少,譬如某些操作异常缓慢,可能跟内存分配或者gc相关。反而 Rust 就稳很多,甚至觉得比 ...
(引用自36楼)

单片机干rust下不了手,好使吗?
感觉小项目有点束手束脚。

tinygo在什么情境下缓慢的? 还有印象吗

出0入0汤圆

 楼主| 发表于 2025-5-29 18:24:47 | 显示全部楼层
dukelec 发表于 2025-5-29 12:41
读写 /sys/class/gpio/export 系列文件操作 gpio 已经过时了,新内核已经不再支持了

现在一般是用 gpiod  ...
(引用自46楼)

谢谢您的提点, 下面是采用您提示的方法, 用AI 帮助生成的点灯程序, 也同样可以驱动LED.

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5. #include <sys/ioctl.h>
  6. #include  <string.h>

  7. //#include <linux/gpio.h>
  8. #include "/usr/include/linux/gpio.h"

  9. #define GPIOCHIP_DEVICE "/dev/gpiochip0"
  10. #define GPIO_LINE_OFFSET 199 // 根据实际引脚编号修改

  11. int main() {
  12.     int fd;
  13.     struct gpiohandle_request req;
  14.     struct gpiohandle_data data;

  15.     // 打开 GPIO 字符设备
  16.     fd = open(GPIOCHIP_DEVICE, O_RDWR);
  17.     if (fd < 0) {
  18.         perror("Failed to open GPIO device");
  19.         return -1;
  20.     }

  21.     // 配置 GPIO 引脚为输出模式
  22.     memset(&req, 0, sizeof(req));
  23.     req.lineoffsets[0] = GPIO_LINE_OFFSET; // GPIO 引脚编号
  24.     req.flags = GPIOHANDLE_REQUEST_OUTPUT; // 设置为输出模式
  25.     req.lines = 1; // 控制 1 个引脚
  26.     strcpy(req.consumer_label, "gpio-led"); // 标签,用于调试

  27.     if (ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &req)) {
  28.         perror("Failed to get line handle");
  29.         close(fd);
  30.         return -1;
  31.     }
  32.     for(int i=0;i<10;i++)
  33.     {
  34.     // 设置 GPIO 引脚的电平来控制 LED
  35.     data.values[0] = 1; // 设置为高电平,点亮 LED
  36.     if (ioctl(req.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &data)) {
  37.         perror("Failed to set GPIO line value");
  38.         close(req.fd);
  39.         close(fd);
  40.         return -1;
  41.     }

  42.     printf("LED turned on\n");

  43.     sleep(1); // 保持 1 秒

  44.     // 关闭 LED
  45.     data.values[0] = 0; // 设置为低电平,关闭 LED
  46.     if (ioctl(req.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &data)) {
  47.         perror("Failed to set GPIO line value");
  48.         close(req.fd);
  49.         close(fd);
  50.         return -1;
  51.     }

  52.     printf("LED turned off\n");
  53.     sleep(1);
  54.     }
  55.     // 关闭文件描述符
  56.     close(req.fd);
  57.     close(fd);

  58.     return 0;
  59. }
复制代码


出0入328汤圆

发表于 2025-5-29 18:38:53 来自手机 | 显示全部楼层
albert_w 发表于 2025-5-29 17:35
单片机干rust下不了手,好使吗?
感觉小项目有点束手束脚。


(引用自48楼)

单片机我只在esp32上用过rust,优点是有标准库的支持,一些在C上难以实现的需求在rust生态下可能比较多相关库选择。rust 还有一个好处是不会允许你做那些在c上经常做的骚操作,譬如全局资源不加锁就在多个地方读写。不过如果你已经是c高手,那就没必要换rust。

rust最大的缺点是开发效率很低,所以我现在只在内存紧缺的地方才会用rust,譬如iOS网络插件,其他时候基本上go是最优选择,甚至上位机我现在基本上也是 go 实现逻辑,用flutter 或者 reactjs 做 UI

出0入942汤圆

发表于 2025-5-29 18:42:18 | 显示全部楼层
yplin27 发表于 2025-5-29 18:38
单片机我只在esp32上用过rust,优点是有标准库的支持,一些在C上难以实现的需求在rust生态下可能比较多相 ...
(引用自50楼)

现在人懒得很,就想找撸代码快速的。 不过项目大,人多可能rust还是挺好,避免有人把项目干崩了。

tinygo试了试在stm32常规应用感觉还可以。但是不支持硬件浮点数单元,是个遗憾。 小心点写flash占用也还好,go的轮子也还行。特别的地方就直接动寄存器

出0入8汤圆

发表于 2025-5-29 21:28:41 | 显示全部楼层
全志T113,之前要控制一个IO口,死活找不到export方法。然后直接用的别的驱动层里面的功能实现的。

出0入0汤圆

 楼主| 发表于 2025-6-3 12:01:55 | 显示全部楼层
发现lvgl在linux上使用的一个现象, 不知道大家是否有发现? 手指离开目标很远还可以触发.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2026-3-16 22:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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