明确设备

虽然mac中可以在homebrew中找到各种交叉编译器,但是嵌入式往往需要专用的交叉编译器,一般只有X86的编译器。因此无论在mac上直接使用还是使用mac端的虚拟机,本质上还是arm,无法使用X86的编译器。

设备扩展

Mac也有X86的,选择Mac mini
因此我的解决方案就是MacBook M1 + Mac mini X86 (microsoft remote desktop投屏到MacBook)这个方案只需要多加几百块就可以完美获得Windows+Linux+macOS开发环境。

设备扩展2.0(Windows用看这里!)

如果你恰好有一台服务器,那么将会拥有超级简单的开发环境,就是PC(或者Mac)直接本地SCP将文件发送到服务器。在服务器端设定某个文件夹下检测到这个发送的文件时,自动编译文件。然后再在本地SCP获取这个文件。虽然听起来好像也不方便,但是!!这些工作都可以交给脚本来做。
也就是说,在传统的开发环境下,
最快的情况:

  1. 打开终端1,SSH开发版,打开终端2
  2. 打开占用很多资源的虚拟机终端3(一段时间。。。。。。)
  3. Coding
  4. 使用Linux的终端3编译到共享文件夹
  5. 在终端2将共享文件夹的可执行文件SCP(或者TFTP、NFS)到开发版
  6. 在终端1执行文件

使用服务器:

  1. 打开终端1,SSH开发版,打开终端2
  2. Coding
  3. 在终端2输入alias好的命令
  4. 在终端1执行文件

如何搭建环境

服务器的搭建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# 一、下载监控软件
sudo apt-get install inotify-tools

touch watch_and_compile.sh
# 二、编写脚本,检测到文件夹出现某个文件后编译(设置特定的路径和名字)
#!/bin/bash

WATCH_DIR="/root"
FILE_NAME="1.c"
COMPILED_FILE="1"
FAILURE_FILE="2.c"

while true; do
# 使用 inotifywait 监控文件创建事件
inotifywait -e create "$WATCH_DIR" | while read path action file; do
if [ "$file" == "$FILE_NAME" ]; then
echo "Detected $FILE_NAME"

# 增加短暂的等待时间,确保文件已完全写入
sleep 1

# 输出 1.c 文件内容
echo "Contents of $FILE_NAME:"
cat "$WATCH_DIR/$FILE_NAME"

# 编译 1.c
echo "Compiling $FILE_NAME..."
arm-linux-gcc "$WATCH_DIR/$FILE_NAME" -o "$WATCH_DIR/$COMPILED_FILE"

if [ $? -eq 0 ]; then
echo "Compilation successful."
rm "$WATCH_DIR/$FILE_NAME" # 编译成功后删除 1.c 文件
else
echo "Compilation failed."
rm "$WATCH_DIR/$FILE_NAME" # 编译失败后删除 1.c 文件
touch "$WATCH_DIR/$FAILURE_FILE" # 创建 2.c 文件
fi
fi
done
done


chmod +x watch_and_compile.sh

# 三、设置开机启动脚本,并且意外退出时可以自动重新启动
sudo nano /etc/systemd/system/watch_and_compile.service

[Unit]
Description=Watch and Compile Service
After=network.target

[Service]
ExecStart=/root/watch.sh
Restart=always

[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload
sudo systemctl start watch_and_compile.service
sudo systemctl enable watch_and_compile.service

# 停止服务
sudo systemctl stop watch_and_compile.service
# 禁用开启启动
sudo systemctl disable watch_and_compile.service

本地Wind或Mac

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 编写脚本,SCP上载和下载
vim transfer_and_get.sh

#!/bin/bash

# 配置变量
LOCAL_FILE="/Users/boweihao/Auto/1.c"
REMOTE_USER="root"
REMOTE_HOST="34.30.22.253"
REMOTE_DIR="/root"
REMOTE_FILE="$REMOTE_DIR/1"
LOCAL_DEST_DIR="/Users/boweihao/Auto"

# 传输本地文件到服务器
echo "正在将文件传输到服务器..."
scp -p "$LOCAL_FILE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR"
if [ $? -ne 0 ]; then
echo "文件传输到服务器失败。"
exit 1
fi
echo "文件传输成功。"

# 等待2
sleep 2

# 获取服务器上的文件到本地
echo "正在获取服务器上的文件..."
scp -p "$REMOTE_USER@$REMOTE_HOST:$REMOTE_FILE" "$LOCAL_DEST_DIR"
if [ $? -ne 0 ]; then
echo "从服务器获取文件失败。"
exit 1
fi
echo "文件获取成功。"




# 在环境变量中添加一条alias信息,方便执行脚本
alias transform='/Users/boweihao/Auto/transfer_and_get.sh'

开发版

1
2
3
4
# 在环境变量中添加一条alias,自动从PC(或Mac)获取编译好的文件chmod,然后执行

alias ddd='cd /root/user && scp -p boweihao@192.168.48.24:/Users/boweihao/Auto/1 /root/user/ && sleep 2 && chmod 777 1 && ./1'