HC32F030F8TA移植FreeRTOS后LED常亮 不能正常闪烁

#HC32F030F8TA移植FreeRTOS后LED常亮 不能正常闪烁
#keil环境 编译烧录 通过
#不清楚具体是否和中断向量或者FreeRTOS配置的RAM有关
以下整个项目的工程文件:

https://t.wss.ink/f/aqkyefq3w5f  复制链接到浏览器打开

img

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

#include "hc32f030.h" 
/* Ensure stdint is only used by the compiler, and not the assembler. */
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
    #include <stdint.h>
    extern uint32_t SystemCoreClock;
#endif

 
#define configUSE_PREEMPTION                1//抢占式调度器开关
#define configUSE_IDLE_HOOK                 0//空闲任务钩子函数
#define configUSE_TICK_HOOK                 0//时间片钩子函数
#define configCPU_CLOCK_HZ                  ( SystemCoreClock )//CPU主频
#define configTICK_RATE_HZ                  ( ( TickType_t ) 1000 )//RTOS节拍频率 即1秒的中断次数
#define configMAX_PRIORITIES                ( 5 )//可使用的最大优先级
#define configMINIMAL_STACK_SIZE            ( ( unsigned short ) 64 )//定义空闲任务使用的堆栈大小
#define configTOTAL_HEAP_SIZE               ( ( size_t ) ( 6*1024 ) )//RTOS内核总计可用的有效的RAM大小
#define configMAX_TASK_NAME_LEN             ( 12 )//任务名最大长度
#define configUSE_TRACE_FACILITY            0//是否启动可视化跟踪调试
#define configUSE_16_BIT_TICKS              0//系统节拍计数器的变量类型  0为32位 1为16为
#define configIDLE_SHOULD_YIELD             1//空闲任务放弃CPU使用权给其他同优先级的用户任务
#define configUSE_MUTEXES                   1//是否使用互斥信号量
#define configQUEUE_REGISTRY_SIZE           8//设置可以注册的信号量和消息队列个数
#define configCHECK_FOR_STACK_OVERFLOW      0//堆栈溢出检查 大于0有效
#define configUSE_RECURSIVE_MUTEXES         1//是否使用递归互斥信号量
#define configUSE_MALLOC_FAILED_HOOK        0//内存申请失败钩子函数
#define configUSE_APPLICATION_TASK_TAG      0//为任务分配标签
#define configUSE_COUNTING_SEMAPHORES       1//是否使用计数信号量
#define configGENERATE_RUN_TIME_STATS       0//是否启用运行时间统计功能
 
/* Co-routine definitions. */
#define configUSE_CO_ROUTINES               0//启用协程,启用协程以后必须添加文件croutine.c
#define configMAX_CO_ROUTINE_PRIORITIES     ( 2 )//协程的有效优先级数目
 
/* Software timer definitions. */
#define configUSE_TIMERS                    0//是否启用软件定时器
#define configTIMER_TASK_PRIORITY           ( 2 )//软件定时器优先级
#define configTIMER_QUEUE_LENGTH            ( 5 )//软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH        ( 80 )//软件定时器任务堆栈大小
 
/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. *///是否启用RTOS API函数
#define INCLUDE_vTaskPrioritySet            1
#define INCLUDE_uxTaskPriorityGet           1
#define INCLUDE_vTaskDelete                 1
#define INCLUDE_vTaskCleanUpResources       1
#define INCLUDE_vTaskSuspend                1
#define INCLUDE_vTaskDelayUntil             1
#define INCLUDE_vTaskDelay                  1
 
/* Normal assert() semantics without relying on the provision of an assert.h
header file. */
#define configASSERT( x ) if( ( x ) == 0 )  { taskDISABLE_INTERRUPTS(); for( ;; ); }
 
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names - or at least those used in the unmodified vector table. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler



#endif /* FREERTOS_CONFIG_H */

参考GPT和自己的思路:

根据你提供的信息,LED常亮不能正常闪烁可能是因为存在以下几个原因:

1.任务优先级设置不合理,导致任务无法按照预期的顺序执行。建议检查任务的优先级设置,并确保优先级较高的任务不会一直占用CPU资源。

2.堆栈大小设置不合理,导致堆栈溢出。建议增加堆栈大小并重新编译程序。

3.中断服务函数写错或者配置不正确,建议检查中断服务函数的实现,并确保中断服务函数与中断向量表的配置一致。

4.FreeRTOS内存配置有误,建议检查FreeRTOS配置文件中关于内存的设置,并根据RAM的实际情况进行调整。

建议你检查以上四个方面的问题,一一排查,直到解决问题为止。同时,可以使用调试工具来辅助定位问题,例如通过逐步执行代码、查看变量值、查看堆栈和任务状态等方式来帮助排除故障。

参考GPT和自己的思路:从你提供的代码来看,你没有在代码中配置LED常亮的部分,因此我无法确定为什么LED会常亮而不能正常闪烁。同时,我也无法在代码中看到有任何关于中断向量或FreeRTOS配置的RAM的问题。我建议你检查以下几个问题:

1 你在代码中正确地配置了LED端口和引脚吗?如果你使用的是开发板,你需要查看开发板手册以了解正确的LED端口和引脚。

2 你是否正确地配置了时钟?你需要确保系统时钟频率设置正确,否则会导致系统无法正常工作。

3 你是否正确地配置了FreeRTOS任务和调度器?如果你没有正确地配置任务和调度器,那么LED无法正常工作。

如果你仍然无法解决问题,你可以尝试使用调试工具(如JTAG或仿真器)来调试代码并查找问题所在。

根据您提供的信息,可能的原因是您在配置 FreeRTOS 内存大小时,将 configTOTAL_HEAP_SIZE 设置为了 6KB,而实际的 MCU RAM 大小是 8KB。这可能会导致 FreeRTOS 在初始化时申请的内存不足,从而导致运行时错误。

您可以尝试将 configTOTAL_HEAP_SIZE 值增加到 8KB 或更高,以确保 FreeRTOS 能够在运行时分配足够的内存。

另外,您可以检查一下 FreeRTOS 中的任务堆栈大小是否合适,以确保任务运行时不会出现栈溢出的情况。此外,还可以检查一下中断向量表是否正确,以及是否正确配置了时钟和时钟中断。

希望对您有所帮助!

基于最新版ChatGPT4的回答,望采纳!!!有其他问题也可以询问我哦、”(最新版更智能,功能更加强大)

首先,从您提供的 FreeRTOS 配置文件来看,配置看起来是合理的。但是,为了确保 LED 闪烁问题的解决,我们需要检查一下其他方面。以下是一些建议和解决方案:

  1. 检查硬件设置: 确保您正确配置了 LED 相关的引脚。检查您的代码是否正确初始化了这些引脚,并将它们设置为输出模式。
  2. 检查 LED 闪烁任务: 确保您已经创建了一个任务来处理 LED 闪烁。这个任务应该包含一个简单的循环,用于切换 LED 的状态,并在每次切换后调用 vTaskDelay()vTaskDelayUntil() 函数。例如:
void LEDBlinkTask(void *pvParameters)
{
    // Initialize LED pin as output
    // ...
    
    while (1)
    {
        // Toggle LED state
        // ...

        // Delay for a period of time
        vTaskDelay(pdMS_TO_TICKS(500)); // 500 ms delay
    }
}

并在主函数中创建此任务:

int main(void)
{
    // System and peripherals initialization
    // ...

    // Create the LED blink task
    xTaskCreate(LEDBlinkTask, "LED Blink", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);

    // Start the scheduler
    vTaskStartScheduler();

    // Should never reach here
    for (;;);
}
  1. 确保系统时钟配置正确: 检查系统时钟配置,确保 SystemCoreClock 变量被正确设置。在启动文件或主函数中,调用 SystemInit() 或类似的函数来配置系统时钟。这将确保 FreeRTOS 能够正确计算延迟和节拍。
  2. 考虑可能的中断问题: 如果以上都正确,可能存在中断问题。检查是否有其他中断源可能干扰 FreeRTOS 的正常运行。此外,确保启动文件中的中断向量表包含 FreeRTOS 所需的中断处理程序:
void SVC_Handler(void) __attribute__((weak, alias("vPortSVCHandler")));
void PendSV_Handler(void) __attribute__((weak, alias("xPortPendSVHandler")));
void SysTick_Handler(void) __attribute__((weak, alias("xPortSysTickHandler")));

这些步骤应该能帮助您解决 LED 无法正常闪烁的问题。如果问题仍然存在,请提供更多关于项目的代码和设置的详细信息。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据你提供的信息和代码,很难准确地判断问题所在。但是,根据经验,有可能在任务的实现中有问题。以下是一份可能有用的示例代码,请参考:

#include "hc32f030.h" 
#include "FreeRTOS.h"
#include "task.h"

#define LED_PORT GPIO_PORT_3
#define LED_PIN GPIO_PIN_2


void vTaskBlink( void *pvParameters );

int main( void )
{
    /* 系统初始化代码 */
    /* ... */

    /* 创建任务 */
    xTaskCreate( vTaskBlink, "Blink", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );

    /* 启动任务调度器 */
    vTaskStartScheduler();

    /* 在任务调度器返回之前,如果处于此状态,发生错误 */
    while( 1 );
}


void vTaskBlink( void *pvParameters )
{
    /* 初始化端口为输出 */
    M0P_GPIO->P3_DIR_f.P23 = 1;

    for(;;)
    {
        /* 熄灭LED */
        M0P_GPIO->P3OUT_f.P3 = 1;
        vTaskDelay( pdMS_TO_TICKS( 500 ) );

        /* 点亮LED */
        M0P_GPIO->P3OUT_f.P3 = 0;
        vTaskDelay( pdMS_TO_TICKS( 500 ) );
    }
}

另外,如果你需要帮助来查找由于任务错误而导致LED常亮的问题,请检查以下几个方面:

  1. 确认任务是否被正确创建。
  2. 确认任务是否正常工作。可以通过加入调试信息或逐一排除来实现。
  3. 可以使用Oscilloscope或逻辑分析仪来检查LED是否收到正确的PWM信号。
  4. 可以使用调试器单步执行代码,以确定问题发生的位置。

祝您好运!
如果我的回答解决了您的问题,请采纳!