报错如下。
bsp\artinchip\hal\syscfg\hal_syscfg.c: In function 'syscfg_gmac_init':
bsp\artinchip\hal\syscfg\hal_syscfg.c:408:42: error: 'SYSCFG_GMAC_RXDLY_SEL_SHIFT' undeclared (first use in this function); did you mean 'SYSCFG_GMAC_TXDLY_SEL_SHIFT'?
408 | cfg |= (AIC_DEV_GMAC0_RXDELAY << SYSCFG_GMAC_RXDLY_SEL_SHIFT);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
| CC bsp\artinchip\sys\d13x\time.c
SYSCFG_GMAC_TXDLY_SEL_SHIFT
bsp\artinchip\hal\syscfg\hal_syscfg.c:408:42: note: each undeclared identifier is reported only once for each function it appears in
CC bsp\artinchip\sys\d13x\trap_c.c
scons: *** [output\d13x_cbs-nor_rt-thread_can2eth\bsp\artinchip\hal\syscfg\hal_syscfg.o] Error 1
scons: building terminated because of errors.
之前遇到过这个问题,忘了是怎么解决的了,好像是自己加了个这个定义。
今天更新到1.0.4后,再次编译,又遇到这个错误了。
请教,该如何解决?
离线
追踪SYSCFG_GMAC_RXDLY_SEL_SHIFT这个定义,发现需要AIC_SYSCFG_DRV_V10这个宏定义使能才有其定义。没找到怎么打开这个功能。
#if AIC_DEV_GMAC0_RXDELAY
cfg |= (AIC_DEV_GMAC0_RXDELAY << SYSCFG_GMAC_RXDLY_SEL_SHIFT);
#endif
然后返回来,看到AIC_DEV_GMAC0_RXDELAY这个定义,是在me菜单里gmac0参数设置里配置的,默认是12,改成0后,就不执行下边那行了,可以通过编译了。
离线
网口又遇到问题了,这个板子之前用1.0.3版本sdk时,网口能调通。
现在用1.0.4,pc可以ping通板子,板子无法ping通pc。
离线
板子没问题,pc切到ubuntu后,板子可以ping通pc。
看样子是win10需要做些配置修改。
那么有个问题,如果不像修改win10配置,就这样ping不通win10,那么影响板子通过udp和tcp连接win10吗?
最近编辑记录 Gentlepig (2024-05-14 12:03:05)
离线
想在屏幕上显示本机ip,查看ifconfig命令的实现,看到是读取了全局变量netif_list或netif_default。
于是在Lvgl界面初始化里加了个label,初始化值为netif_list->ip_addr,按钮回调函数里,也更新这个label值为netif_list->ip_addr.
结果下载后第一次运行,能正常显示本机地址。但是重启后,就进不到应用程序了,串口中断也卡住不更新了。
后来发现在设置lalbe值为netif_list->ip_addr之前,加个rt_thread_mdelay(),不管多小。界面就又正常了。
请教,这是为什么?
void test_ui_init()
{
lv_obj_t * btn = lv_btn_create(lv_scr_act()); /*Add a button the current screen*/
lv_obj_set_pos(btn, 50, 50); /*Set its position*/
lv_obj_set_size(btn, 120, 50); /*Set its size*/
lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_ALL, NULL); /*Assign a callback to the button*/
lv_obj_t * label = lv_label_create(btn); /*Add a label to the button*/
lv_label_set_text(label, "get ip address"); /*Set the labels text*/
lv_obj_center(label);
rt_thread_mdelay(1);
labelIpaddr = lv_label_create(lv_scr_act());
lv_label_set_text_fmt(labelIpaddr, "local ip addr:0x%X", 0xaa55);
lv_label_set_text_fmt(labelIpaddr, "local ip addr: %s", ip4addr_ntoa(&netif_list->ip_addr));
lv_obj_set_pos(labelIpaddr, 200, 50);
lv_obj_set_size(labelIpaddr, 400, 50);
}
离线
比如 netif_list 为空?甚至还没初始化,是个脏值。
不检查就直接访问么?
确实是这个问题,lvgl线程和lwip_test_example优先级相同,改成lwip线程优先级更高一点就没事了。
请教,netif_list没初始化时,lvgl线程调用netif_list->ip_addr为什么会卡死?因为该指针是个不正常的位置值,进行读取造成程序无法运行?
另,如何检查呢?不懂指针的检查方法?
-------------------------------
搜了下,说是c语言指针未初始化时为NULL,也就是0.
那么netif_list为0时,调用netif_list->ip_addr为什么程序会卡死?
-------------------------------
gpt回答的:
在C语言中,如果一个指针未初始化,那么访问该指针所指向的结构体变量会导致未定义的行为。这可能会导致程序崩溃、产生奇怪的结果,或者其他不可预测的行为。
未初始化的指针会包含一个未知的内存地址,当你尝试通过这个指针去访问结构体的成员时,实际上是在尝试读取一个未知内存地址的内容,这是非常危险的行为。这种行为可能导致程序崩溃,或者读取到不可预测的数据,因为该内存区域可能被其他数据所覆盖,或者根本不存在有效数据。
因此,在使用指针之前,一定要确保将其初始化为合适的值,比如将其设置为一个有效的内存地址,或者使用NULL来表示空指针。
最近编辑记录 Gentlepig (2024-05-17 09:02:52)
离线
复习下C语言的基础吧。只有位于BSS段的全局变量才会被自动初始化为0,而且这个初始化不是语言本身实现的,而是执行main函数之前的启动代码执行的。
受教。
解决了
将rx tx延时设置为0,就不会报错了。
最近编辑记录 Gentlepig (2024-05-17 10:39:20)
离线