ManjaroKDE 编译OpenMV

环境

manjaro: 18.1.2
kernel:5.3.7-2
gcc: 9.2.0
openmv: d8782275e3db852ecc041288fc45932526b4dec6

获取源代码

  1. (非必要,可提高国内克隆速度)使用gitee导入openmvmicropython
  2. 克隆库
git clone https://gitee.com/fefr/openmv.git
cd openmv
vim .gitmodules 

.gitmodules中的url替换成https://gitee.com/fefr/openmv.git,如下

[submodule "src/micropython"]
        path = src/micropython
        url = https://gitee.com/fefr/micropython.git
        branch = openmv

然后同步子模块

git submodule init
git submodule update --recursive

micropython库中又引入了其他子模块,故需要加入--recursive,其子模块默认是拉取github上的资源,若速度慢时可参照上边的方法将micropython的子模块地址修改为gitee。

以上步骤可直接使用命令git clone https://github.com/openmv/openmv --recurse-submodules获取,但国内速度可能非常慢。

安装工具

pacman -S arm-none-eabi-gcc amr-none-eabi-binutils arm-none-eabi-newlib
若漏掉arm-none-eabi-newlib则会在make的时候报错:

/usr/lib/gcc/arm-none-eabi/9.2.0/include/stdint.h:9:16: fatal error: stdint.h: No such file or directory
    9 | # include_next <stdint.h>
      |                ^~~~~~~~~~
compilation terminated.

编译

切换到openmv/src目录下执行make会报错:

src/winc.c: In function 'wifi_callback_sta':
src/winc.c:380:13: error: 'strncpy' output may be truncated copying 32 bytes from a string of length 32 [-Werror=stringop-truncation]
  380 |             strncpy((char*) wscan_result.ssid, (const char *) scan_result->au8SSID, WINC_MAX_SSID_LEN-1);
      |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/winc.c:344:13: error: 'strncpy' output may be truncated copying 32 bytes from a string of length 32 [-Werror=stringop-truncation]
  344 |             strncpy(netinfo->ssid, con_info->acSSID, WINC_MAX_SSID_LEN-1);
      |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors

具体原因可参考这里,大概原因就是scan_result->au8SSID大小与wscan_result.ssid一样且strncpy第三个参数是WINC_MAX_SSID_LEN-1(即wscan_result.ssid大小),编译器认为wscan_result.ssid[WINC_MAX_SSID_LEN-1]可能不为'\0'而报错,因为使用strncpy表明使用者原意wscan_result.ssid是一个字符串,而字符串必定以'\0'结束,解决办法有两个:

  1. 将strncpy修改为memcpy
  2. 执行strncpy后添加一行代码wscan_result.ssid[WINC_MAX_SSID_LEN-1] = '\0';

继续执行make后报错:

main.c: In function '__fatal_error':
main.c:210:9: error: array subscript 0 is outside array bounds of 'char[1]' [-Werror=array-bounds]
  210 |     if (f_open(&vfs_fat->fatfs, &fp, "ERROR.LOG",
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  211 |                FA_WRITE|FA_CREATE_ALWAYS) == FR_OK) {
      |                ~~~~~~~~~~~~~~~~~~~~~~~~~~
main.c:80:13: note: while referencing '_vfs_buf'
   80 | extern char _vfs_buf;
      |             ^~~~~~~~

原因是在openmv/src/omv/main.c中有定义如下:

extern char _vfs_buf;
static fs_user_mount_t *vfs_fat = (fs_user_mount_t *) &_vfs_buf;

_vfs_buf是char型而fs_user_mount_t是一个结构体,-Werror=array-bounds可能对某些情况下的强制转换前后数组大小有特殊检查,实验如下:

extern char _vfs_buf[1];
static fs_user_mount_t *vfs_fat = (fs_user_mount_t *) _vfs_buf;

以上代码依然报错,但改成如下时则没有报错:

extern char _vfs_buf[1];
static fs_user_mount_t *vfs_fat = (fs_user_mount_t *) &_vfs_buf[0];

以上不是解决办法,因为_vfs_bufopenmv/src/omv/stm32fxx.ld.S中定义,是连接脚本中的一个符合(参考文档),解决办法如下:

extern char _vfs_buf[];
static fs_user_mount_t *vfs_fat = (fs_user_mount_t *) _vfs_buf;

同样需要修改的地方还有openmv/src/omv/lepton.c中的_line_buf_vospi_buf

extern uint8_t _line_buf[];
extern uint8_t _vospi_buf[];
...
static uint8_t *vospi_packet = _line_buf;
static uint8_t *vospi_buffer = _vospi_buf;

备注:
Nordic的代码使用ld连接脚本的符号时在C文件中声明为指针:
extern char *_vfs_buf;
这种用法虽然在参考文档中没有提及但更好理解,因为ld文件中的符号并没有实际分配空间,和goto使用的符号很像。
如果使用以上方法时紧接着下面的
static fs_user_mount_t *vfs_fat = (fs_user_mount_t *) _vfs_buf;
会报错initializer element is not constant,此时需要将vfs_fat的赋值移到函数里才能编译通过,因为此时_vfs_buf是一个变量不能在全局作为初始化值,而声明为_vfs_buf[]时_vsf_buf只是一个符号在实际内存中不占用空间故能作为初始化值。

之后能顺利编译完成。

编译OPENMV3固件

以上是执行make默认编译的是OPENMV4,使用命令make TARGET=OPENMV3编译时会报错:

src/stm32f7xx_ll_usb.c: In function 'USB_WritePacket':
src/stm32f7xx_ll_usb.c:820:7: error: 'packed' attribute ignored for type 'uint32_t *' {aka 'long unsigned int *'} [-Werror=attributes]
  820 |       USBx_DFIFO(ch_ep_num) = *((__packed uint32_t *)src);
      |       ^~~~~~~~~~
src/stm32f7xx_ll_usb.c: In function 'USB_ReadPacket':
src/stm32f7xx_ll_usb.c:846:5: error: 'packed' attribute ignored for type 'uint32_t *' {aka 'long unsigned int *'} [-Werror=attributes]
  846 |     *(__packed uint32_t *)dest = USBx_DFIFO(0);
      |     ^
cc1: all warnings being treated as errors

此问题是packed属性只支持结构体共同体等复合类型而不支持整形等的基本数据类型,为什么编译OPENMV4的时候没有问题呢?因为OPENMV3的代码没有修复这个bug。
openmv/src/sthal/f7/src/stm32f7xx_ll_usb.c相应代码修改成以下内容即可:

USBx_DFIFO(ch_ep_num) = __UNALIGNED_UINT32_READ(src);
...
__UNALIGNED_UINT32_WRITE(dest, USBx_DFIFO(0));

相关问题可见此处,另micropython相关问题记录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容