C 弗里特斯没有';在atmega32A上无法正常工作

C 弗里特斯没有';在atmega32A上无法正常工作,c,atmega,freertos,rtos,C,Atmega,Freertos,Rtos,我是免费RTOS的新手,我一直在一行一行地学习一些教程,但总结起来并不正确,我使用免费RTOS切换了3个LED,但它只点亮了其中的2个,而没有切换!随机2个LED,无论我更改优先级或切换延迟时间。随机的2个LED只打开了,没什么,我在proteus模拟和真实硬件上尝试了代码,同样的问题也存在。有人能帮我吗 M/C:ATMEGA32A RTOS:FreeRTOS #define F_CPU 1000000UL #include <avr/io.h> #include <util/

我是免费RTOS的新手,我一直在一行一行地学习一些教程,但总结起来并不正确,我使用免费RTOS切换了3个LED,但它只点亮了其中的2个,而没有切换!随机2个LED,无论我更改优先级或切换延迟时间。随机的2个LED只打开了,没什么,我在proteus模拟和真实硬件上尝试了代码,同样的问题也存在。有人能帮我吗

M/C:ATMEGA32A

RTOS:FreeRTOS

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
/* FreeRTOS files. */
#include "FreeRTOS.h"
#include "task.h"
#include "croutine.h"
#include "FreeRTOSConfig.h"


/* Define all the tasks */
static void ledBlinkingtask1(void* pvParameters);
static void ledBlinkingtask2(void* pvParameters);
static void ledBlinkingtask3(void* pvParameters);

int main(void) {

    /* Call FreeRTOS APIs to create tasks, all tasks has the same priority "1" with the
    same stack size*/
    xTaskCreate( ledBlinkingtask1,"LED1",
    configMINIMAL_STACK_SIZE, NULL, 1, NULL );
    xTaskCreate( ledBlinkingtask2,"LED2",
    configMINIMAL_STACK_SIZE, NULL,1, NULL );
    xTaskCreate( ledBlinkingtask3,"LED3",
    configMINIMAL_STACK_SIZE, NULL,1, NULL );

    // Start the RTOS kernel
    vTaskStartScheduler();
    /* Do nothing here and just run infinte loop */
    while(1){};
    return 0;
}

static void ledBlinkingtask1(void* pvParameters){
    /* Define all variables related to ledBlinkingtask1*/
    const uint8_t blinkDelay = 100 ;
    /* make PB0 work as output*/
    DDRB |= (1<<0); //PB0
    /* Start the infinte task 1 loop */
    while (1)
    {
        PORTB ^= (1<<0); //toggle PB0 //PB0
        vTaskDelay(blinkDelay); //wait some time
    }
}

static void ledBlinkingtask2(void* pvParameters){
    /* Define all variables related to ledBlinkingtask2*/
    const uint8_t blinkDelay = 100;
    /* make PB1 work as output*/
    DDRB |= (1<<1);//PB0
    /* Start the infinte task 2 loop */
    while (1)
    {
        PORTB ^= (1<<1); //toggle PB0 //PB0
        vTaskDelay(blinkDelay); //wait some time
    }
}




static void ledBlinkingtask3(void* pvParameters){
    /* Define all variables related to ledBlinkingtask3*/
    const uint16_t blinkDelay = 100;
    /* make PB2 work as output*/
    DDRB |= (1<<2); //PB2
    /* Start the infinte task 3 loop */
    while (1)
    {
        PORTB ^= (1<<2); //toggle PB0 //PB0
        vTaskDelay(blinkDelay); //wait some time
    }
}
#定义F#u CPU 1000000UL
#包括
#包括
/*FreeRTOS文件*/
#包括“FreeRTOS.h”
#包括“task.h”
#包括“croutine.h”
#包括“FreeRTOSConfig.h”
/*定义所有任务*/
静态void LED闪烁task1(void*pvParameters);
静态void LED闪烁ask2(void*pvParameters);
静态void LED闪烁ask3(void*pvParameters);
内部主(空){
/*调用FreeRTOS API创建任务,所有任务与
相同的堆栈大小*/
xTaskCreate(ledblingtask1,“LED1”,
配置最小\u堆栈大小,NULL,1,NULL);
xTaskCreate(LEDBlingTASK2,“LED2”,
配置最小\u堆栈大小,NULL,1,NULL);
xTaskCreate(ledblingtask3,“LED3”,
配置最小\u堆栈大小,NULL,1,NULL);
//启动RTOS内核
vTaskStartScheduler();
/*在这里什么都不做,只运行infinte循环*/
而(一){};;
返回0;
}
静态void LED闪烁task1(void*pvParameters){
/*定义与LEDBlingTASK1相关的所有变量*/
常数8_t闪烁延迟=100;
/*使PB0作为输出工作*/

DDRB |=(1如评论中所述-主要问题似乎是对驱动LED的端口寄存器的访问既不是

PORTB ^= (1<<0); // in task 1
[...]
PORTB ^= (1<<1); // in task 2
[...]
PORTB ^= (1<<2); // in task 3

PORTB^=(1如评论中所述-主要问题似乎是对驱动LED的端口寄存器的访问既不是

PORTB ^= (1<<0); // in task 1
[...]
PORTB ^= (1<<1); // in task 2
[...]
PORTB ^= (1<<2); // in task 3

PORTB^=(1应该有一个互斥体来控制对PORTB寄存器的访问。在开始任务之前,我会在
main
中设置一次DDRB(或者您需要使用互斥体来控制对DDRB的访问)。在开始任务之前,我尝试在main中设置一次DDRB,但即使我将其简化到最大值,它也无法工作(仅切换一个led)它只是停留在
PORTB
上,更新应该是原子的(通过使用互斥体,或者在
PORTB^=(在这种情况下,1个互斥体的重量太重,只需使用taskENTER/EXIT_CRITICAL()宏来包装对端口B的访问。应该有一个互斥体来控制对端口B寄存器的访问。在开始任务之前,我会在
main
中设置一次DDRB(或者您需要使用互斥体来控制对DDRB的访问)。在开始任务之前,我尝试在main中设置一次DDRB,但即使将其简化到最大程度,它也无法工作(仅切换一个led)它只会保持在
PORTB
上更新应该是原子的(通过使用互斥,或者在
PORTB^=(1个互斥将太重,在这种情况下,只需使用taskENTER/EXIT_CRITICAL()宏包装对端口B的访问)。