【STM32MP257学习笔记】2.搭建嵌入式Linux程序开发环境并实现一个HelloWorld
开发需要Linux环境,在上一篇帖子里已经在虚拟机中安装了Ubuntu24.04先安装必要的工具包,在linux终端中执行下面的命令
sudo apt-get update
sudo apt-get install gawk wget git git-lfs diffstat unzip texinfo gcc-multilibchrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libsdl1.2-dev pylint xterm bsdmainutils libusb-1.0-0
sudo apt-get install libssl-dev libgmp-dev libmpc-dev lz4 zstd
sudo apt-get install build-essential libncurses-dev libyaml-dev libssl-dev
sudo apt-get install coreutils bsdmainutils sed curl bc lrzsz corkscrew cvs subversion mercurial nfs-common nfs-kernel-server libarchive-zip-perl dos2unix texi2html libxml2-utils下载SDK,地址https://www.st.com.cn/zh/embedded-software/stm32mp2dev.html,这里有适用于不同架构类型的SDK,根据自己的开发环境选择,注意需要保持SDK版本和烧录的Starter Package版本一致
解压后打开SDK文件夹,这里有个.sh的文件
执行下面的命令开始安装SDK,可以将-d后面的路径替换为你想安装SDK的位置,必须是绝对路径
./st-image-weston-openstlinux-weston-stm32mp2.rootfs-x86_64-toolchain-5.0.8-openstlinux-6.6-yocto-scarthgap-mpu-v25.06.11.sh -d /home/yuyy/Workspace/STM32/STM32MP257/SDK当显示这个表示安装成功
打开SDK目录,执行命令
source environment-setup-cortexa35-ostl-linux这条命令每次打开终端都要执行一次才能让开发环境生效
正确执行后在终端内依次执行下面的命令可以看到如图的结果
echo $ARCH
echo $CROSS_COMPILE
$CC --version
echo $OECORE_SDK_VERSION
如果你和我一样使用VSCode进行开发,为了避免每次打开终端都要手动输入建立开发环境的命令,可以按照下面的方法操作
用VSCode打开工程文件夹,按快捷键Ctrl+Shift+P,找到工作区设置
添加下面的代码后保存
{
"terminal.integrated.profiles.linux": {
"BashSTM32A35ENV": {
"path": "bash",
"args": [
"--init-file",
"/home/yuyy/Workspace/STM32/STM32MP257/SDK/environment-setup-cortexa35-ostl-linux"
]
}
},
"terminal.integrated.defaultProfile.linux": "BashSTM32A35ENV"
}现在在VSCode中打开这个文件夹后打开终端会自动执行建立开发环境的命令
接下来写个简单地Hello World程序,新建helloworld.c,输入以下代码
#include <stdio.h>
int main(int argc,char **argv)
{
printf("STM32MP257 Hello World");
if(argc == 2)
{
printf(" %s",argv);
}
printf("\n");
return 0;
}在VSCode中打开终端,执行下面的命令
$CC -o helloworld helloworld.c将生成的helloworld文件上传到开发板,可以用NFS文件共享或SCP命令,我这里用FileZilla通过SFTP上传
如果不方便连接网线,板子上USB右侧的Type-C接口会虚拟成为一个USB网卡,连接电脑后在串口终端里执行下面的命令来查看IP地址
ip addr show usb0
刚上传上去的文件是不可执行的
用下面的命令增加可执行权限
chmod u+x helloworld再次查看
这时就能执行命令了
接下来给HelloWorld做个窗口UI,将代码改为(这段代码来自https://wiki.stmicroelectronics.cn/stm32mpu/wiki/Getting_started/STM32MP2_boards/STM32MP257x-DK/Develop_on_Arm_Cortex-A35/Create_a_simple_hello-world_application)
#include <gtk/gtk.h>
static void print_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);
}
int main (int argc, char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}新建makefile,添加下面的代码后保存
PROG = helloworld
SRCS = helloworld.c
CLEANFILES = $(PROG)
# Add / change option in CFLAGS and LDFLAGS
CFLAGS += -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))
在VSCode中打开终端,执行make
将生成的helloworld文件上传到开发板并执行,屏幕上会打开这样一个窗口
点击Hello World按钮后窗口关闭,同时串口终端中有输出
双核CPU,建议先跑个分,看看性能,跑分还是比较直观的 Linux程序开发环境UBANTU首选
页:
[1]