启程HelloWorld
OpenSTlinux的环境让我感动的是:板子启动后直接显示图形界面,不会象屏幕输出控制台信息!这个很“炫!”。控制台信息让我很头痛。你给用户输出这些没有用的信息也闹心。
参考ST的官网资料"Create a simple hello-world application",创建程序。
1、首先确认开发环境是否正确
$CC --version
如果不正确,就使用环境脚本文件配置正确!
source /opt/st/stm32mp1/2.6-openstlinux-20-02-19/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
2、开始编程!
使用你喜欢的文本编辑器。我的是
vi gtk_hello_world.c
输入以下代码
#include <gtk/gtk.h>static voidprint_hello (GtkWidget *widget,gpointer data){g_print ("Hello World\n");}static voidactivate (GtkApplication *app,gpointer user_data){GtkWidget *window;GtkWidget *button;GtkWidget *button_box;window = gtk_application_window_new (app);gtk_window_set_title (GTK_WINDOW (window), "Window");gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);gtk_container_add (GTK_CONTAINER (window), button_box);button = gtk_button_new_with_label ("Hello World");g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);gtk_container_add (GTK_CONTAINER (button_box), button);gtk_widget_show_all (window);}intmain (int argc, char **argv){GtkApplication *app;int status;app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);status = g_application_run (G_APPLICATION (app), argc, argv);g_object_unref (app);return status;}
保存文件待用
3、编译程序
编辑Makefile文件
vi Makefile
注意不能直接考本的脚本!必须在“命令前面加tab!!!”
这个是给linux开发新手看的。如果不懂那就快乐的学习一下吧。
PROG = gtk_hello_worldSRCS = gtk_hello_world.cCLEANFILES = $(PROG)# Add / change option in CFLAGS and LDFLAGSCFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)LDFLAGS += $(shell pkg-config --libs gtk+-3.0)all: $(PROG)$(PROG): $(SRCS) $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)clean: rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
编译文件
make
如果没有错误,就可以看到生成的gtk_hello_world文件了
4、上传文件,
scp gtk_hello_world root@192.168.0.103:/usr/local
替换你的IP地址。<board ip address>
转到控制台执行程序。
./gtk_hello_world
在显示器上可以看到图形化的窗口。点击按钮,程序在控制台输出“Hello,World!”
本例程使用的是gtk库,gtk开发十分的麻烦,功能也不怎么丰富。据说可以使用qt5,有时间可以研究一下。
GPIO操作点亮LED
1、GPIO介绍
对于嵌入式开发者来说不能操作硬件是有点说不过去的。所以能够点亮LED才算是正宗的“Hello
World!”对于unix系统“一切皆文件!”,linux系统下的设备文件在/dev目录下。通过查看找到gpiochip0~gpiochip9共10个设备文件。每一个设备文件对应着GPIOs端口。也就是gpiochip0对应着GPIOA口。详细的信息可以使用
cat /sys/kernel/debug/gpio
查看得到。通过资料知道LED5是与GPIOA的14脚相连。使用gpioset工具操作gpiochip0的14脚应该可以操作led5的开断。
gpioset gpiochip0 14=0
可一看到rest按键旁边的led5发光。资料上说好的是Green怎么变成Yellow啦。Yellow也挺好!只要亮就行。
2、使用文件操作GPIO
使用C代码写一个led5程序。开始我想使用libgpiod库来操作gpio。调试了很长时间,也没有成功。没办法找到了一个直接操作设备文件的代码
#include <errno.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/ioctl.h>#include <unistd.h>#include <linux/gpio.h>int main(int argc, char **argv){ struct gpiohandle_request req; struct gpiohandle_data data; char chrdev_name[20]; int fd, ret; strcpy(chrdev_name, "/dev/gpiochip0"); /* Open device: gpiochip0 for GPIO bank A */ fd = open(chrdev_name, 0); if (fd == -1) { ret = -errno; fprintf(stderr, "Failed to open %s\n", chrdev_name); return ret; } /* request GPIO line: GPIO_A_14 */ req.lineoffsets[0] = 14; req.flags = GPIOHANDLE_REQUEST_OUTPUT; memcpy(req.default_values, &data, sizeof(req.default_values)); strcpy(req.consumer_label, "led_gpio_a_14"); req.lines = 1; ret = ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &req); if (ret == -1) { ret = -errno; fprintf(stderr, "Failed to issue GET LINEHANDLE IOCTL (%d)\n", ret); } if (close(fd) == -1) perror("Failed to close GPIO character device file"); /* Start led blinking */ while(1) { data.values[0] = !data.values[0]; ret = ioctl(req.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &data); if (ret == -1) { ret = -errno; fprintf(stderr, "Failed to issue %s (%d)\n", "GPIOHANDLE_SET_LINE_VALUES_IOCTL", ret); } sleep(1); } /* release line */ ret = close(req.fd); if (ret == -1) { perror("Failed to close GPIO LINEHANDLE device file"); ret = -errno; } return ret;}
经过编译,可以成功的控制led5
至此Hello world完成!
对于新手建议参考一下
How to cross-compile with the Developer Package