我有STM32F746ZG Nucleo-144pin电路板,并使用STMCubeMx生成了代码。 我选择了FreeRTOS,它是CubeMx提供的10.0.0版本,工具链是SW4STM32。
我做了两个任务,以下是我的职责。 我的代码在这里:
void led1_task(void)
{
while(1)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
HAL_Delay(1000);
}
}
void led2_task(void)
{
while(1)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);
HAL_Delay(4100);
}
}
我发现如果两个任务具有相同的任务优先级,则两个任务可以正常工作,但是如果它们具有不同的任务优先级,则低级任务将不起作用。
xTaskCreate(led1_task, "led1_task", 1024, NULL, 2, NULL); ==> Works fine.
xTaskCreate(led2_task, "led2_task", 1024, NULL, 2, NULL); ==> Works fine.
----------------------------------------------------------------------------
xTaskCreate(led1_task, "led1_task", 1024, NULL, 2, NULL); ==> This task is not working.
xTaskCreate(led2_task, "led2_task", 1024, NULL, 3, NULL); ==> Works fine.
如果两个任务的堆栈大小合计大于3 KB,则确认该任务无法正常工作。 下面的代码可以正常工作。
xTaskCreate(led1_task, "led1_task", 2048, NULL, 2, NULL); ==> Works fine.
xTaskCreate(led2_task, "led2_task", 1024, NULL, 2, NULL); ==> Works fine.
但是,如果堆栈大小如下更改,第二个任务将无法工作。
xTaskCreate(led1_task, "led1_task", 2048, NULL, 2, NULL); ==> Works fine.
xTaskCreate(led2_task, "led2_task", 2048, NULL, 2, NULL); ==> This task is not working.
尝试在STM32F746ZGTx_FLASH.ld中将_Min_Stack_Size从0x400更改为0x4000时也遇到相同的问题。
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x200; /* required account of heap */
_Min_Stack_Size = 0x4000; /* required account of stack */
有人可以解释原因吗?
答案 0 :(得分:3)
要回答您的问题:
您使用# models.py
def get_current_app_versions(self):
return (
AppVersion.objects
.filter(appversiondevicegrouplink__release_date__lt=timezone.now())
.filter(appversiondevicegrouplink__device_group=self)
.order_by('app_uuid__app_uuid', '-appversiondevicegrouplink__release_date')
.distinct('app_uuid__app_uuid')
)
的优先级较低的任务无法正常工作。此函数执行“活动”阻止,即调用此函数的任务将继续检查内部滴答计数器,直到满足条件为止。换句话说,它不会在RTOS上阻止此任务。您应该使用HAL_Delay
而不是vTaskDelay
。
这里有几点要注意。
a。给HAL_Delay
的堆栈深度以 words 给出,而不是以 bytes 给出。在您的示例中,任务堆栈的组合大小为`(2048 + 1024)* sizeof(uint32_t)'字节。您的情况很多,对于您目前在这里所做的事情来说太多了。
b。如果不进行调试,很难确定为什么第二个任务不起作用,但是很可能第二个任务根本没有创建,因为您遇到了一些限制,例如超过RTOS堆大小。这取决于您使用哪个FreeRTOS内存管理实现(heap_1,heap_2等)。您可能使用取决于xTaskCreate
的值-这是您应分别检查和增加的定义。
c。 configTOTAL_HEAP_SIZE
和_Min_Heap_Size
与FreeRTOS无关(除非您使用内部使用_Min_Stack_Size
的heap_3)。这些对应于RTOS之外的堆和栈。
答案 1 :(得分:0)
您的答案确认它一切正常。
非常感谢您的答复。