本人最近在跟着硬汉大哥的教程学习ThreadX和GUIX,在移植过程中遇到了一些问题,希望硬汉大哥和各位大佬帮忙看看还能不能救~
开发环境版本如下:
CLion-2021.3.4
STM32CubeMX-6.6.1
ThreadX-6.0.2
GUIX-6.0.1
GUN-Tools-ARM-Embedded_2020q4
OpenOCD-0.11.0
开发板:STM32F469I-Discovery
显示屏驱动用的STM32F469的DSI接口,屏幕分辨率800*480.
SDRAM:32Bit-16MByte
环境是用的CLion创建STM32CubeMX工程,然后在STM32CubeMX中进行基本配置,生成STM32CubeIDE工程在Clion中进行编译。
(至于为什么要用CLion呢,开始我也质疑这玩意能用么,但是用上了之后真香!!!回不去了)
说下目前的情况和遇到的问题:
1、当前ThreadX移植应该没有问题,参照硬汉大哥的V6的教程和gcc工程中的文件,FPU在CMake中已经开启,并且测试浮点运算正常,创建任务和任务统计也都正常;
2、当移植GUIX的时候,创建MainTask任务,启动GUIX之后,就会进入到startup_stm32f469nihx.s中的b Infinite_Loop中,此部分代码是用的硬汉大哥教程中的,部分代码如下:
[C] 纯文本查看 复制代码 void MainTask(void)
{
/*初始化配置 */
gx_initconfig();
/* 配置显示屏 */
gx_studio_display_configure(DISPLAY_1, stm32f4_graphics_driver_setup_24xrgb,
LANGUAGE_CHINESE, DISPLAY_1_THEME_1, &root);
/* 创建窗口 */
gx_studio_named_widget_create("window", (GX_WIDGET *)root, (GX_WIDGET **)&pScreen);
/* 显示根窗口 */
gx_widget_show(root);
/* 启动GUIX */
gx_system_start();
while(1)
{
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
// HAL_Delay(100);
tx_thread_sleep(100);
}
}
3、奇怪的事情发生了,(为什么我会在while(1)中注释了HAL_Delay(100)呢?后面说),当我进行Debug调试的时候,看程序是为什么Infinite_Loop,结果发现是没有定义WWDG_IRQHandler,在stm32f4xx_it.c中添加空的WWDG_IRQHandler中断处理函数后,调试时候依然会进入Infinite_Loop,进入的位置又变成了其他没有实现的中断处理函数,我就蒙了,实际的硬件中并没有使用到这些硬件和硬件的中断处理函数,为什么会跳转到这里呢?没有解决,请各位大佬帮忙看看这里。
4、更奇怪的事情也发生了,上面说为什么在while(1)中注释了HAL_Delay(100)?注释掉tx_thread_sleep(100);,改用HAL_Delay(100),程序竟然奇迹般的运行起来了,也不再进入Infinite_Loop,(虽然此时GUIX是否正常工作起来未知,因为DSI和LTDC配置上好像还有些问题,显示屏还无法显示),HAL的时基用的TIM2实现的。不知ThreadX的tx_thread_sleep为什么会有这样的问题,没有GUIX的时候是正常的,加入GUIX后在MainTask中初始化GUIX后,调用tx_thread_sleep程序就会进入Infinite_Loop,请各位大佬看看这里如何拯救?
最后放上我的完整的工程,以供参考。
|