#HC32F030F8TA移植FreeRTOS后LED常亮 不能正常闪烁
#keil环境 编译烧录 通过
#不清楚具体是否和中断向量或者FreeRTOS配置的RAM有关
以下整个项目的工程文件:
https://t.wss.ink/f/aqkyefq3w5f 复制链接到浏览器打开
#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 闪烁问题的解决,我们需要检查一下其他方面。以下是一些建议和解决方案:
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 (;;);
}
SystemCoreClock
变量被正确设置。在启动文件或主函数中,调用 SystemInit()
或类似的函数来配置系统时钟。这将确保 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常亮的问题,请检查以下几个方面:
祝您好运!
如果我的回答解决了您的问题,请采纳!