我尝试在LPC3250上移植FreeRTOS,但我的端口工作不稳定。我尝试使用托马斯·金德勒的端口,它是可用的here我和我的端口捕获了相同的行为。我尝试执行以下内容:
void task1(void *) {
BOOL_8 blink1 = TRUE;
TickType_t xLastWakeTime;
const TickType_t xFrequency = 500;
xLastWakeTime = xTaskGetTickCount();
while(true) {
if (blink1)
cpld_set_bits(ECPLDLeds, CPLD_LED_1);
else
cpld_clear_bits(ECPLDLeds, CPLD_LED_1);
blink1 = (~blink1) & 0x1;
// for (volatile int i=0; i < 8000000; ++i);
// vTaskDelay(500 / portTICK_PERIOD_MS);
vTaskDelayUntil( &xLastWakeTime, xFrequency );
}
}
void task2(void *) {
BOOL_8 blink2 = FALSE;
TickType_t xLastWakeTime;
const TickType_t xFrequency = 500;
xLastWakeTime = xTaskGetTickCount();
while(true) {
if (blink2)
cpld_set_bits(ECPLDLeds, CPLD_LED_2);
else
cpld_clear_bits(ECPLDLeds, CPLD_LED_2);
blink2 = (~blink2) & 0x1;
// for (volatile int i=0; i < 8000000; ++i);
// vTaskDelay(500 / portTICK_PERIOD_MS);
vTaskDelayUntil( &xLastWakeTime, xFrequency );
}
}
extern "C" int c_entry()
{
bool blink5 = true;
isens_board_init();
BaseType_t result = xTaskCreate(
task1,
"task1",
configMINIMAL_STACK_SIZE,
NULL,
tskIDLE_PRIORITY + 1,
&task1Handle
);
(void)result;
BaseType_t result2 = xTaskCreate(
task2,
"task2",
configMINIMAL_STACK_SIZE,
NULL,
tskIDLE_PRIORITY + 1,
&task2Handle
);
(void)result2;
vTaskStartScheduler();
while(true) {
if (blink5)
cpld_set_bits(ECPLDLeds, CPLD_LED_0);
else
cpld_clear_bits(ECPLDLeds, CPLD_LED_0);
blink5 = !blink5;
for (volatile int i=0; i < 16000000; ++i);
}
return 0;
}
如果我运行延迟了for()循环的任务 - 它可以正常工作。如果我运行由vTaskDelay或vTaskDelayUntil函数延迟的任务 - 它运行不好。我看到了下面的行为:两次转换得很好,但是后来任务1停止了。几秒钟后(5-10)再次点亮,然后在随机周期后再次关闭。 Task2的指示灯以500毫秒的周期稳定闪烁。
也许这是不正确的初创公司的影响?或者mmu的使用不好(我使用现金使用mmu)?我必须使用支持mmu的FreeRTOS吗?
谢谢。