This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] SK-AM62B-P1:此代码的替代方法是什么?

Guru**** 1831610 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1427832/sk-am62b-p1-alternate-ways-to-this-code

器件型号:SK-AM62B-P1

工具与软件:

#include <stdlib.h>
#include <kernel/dpl/DebugP.h>
#include "ti_drivers_config.h"
#include "ti_board_config.h"
#include "ti_drivers_open_close.h"
#include "ti_board_open_close.h"
#include "FreeRTOS.h"
#include "task.h"

#define MAIN_TASK_PRI  (configMAX_PRIORITIES-1)
#define MAIN_TASK_SIZE (16384U/sizeof(configSTACK_DEPTH_TYPE))
#define I2C_TASK_PRI (configMAX_PRIORITIES-2)
#define I2C_TASK_SIZE (4096U/sizeof(configSTACK_DEPTH_TYPE))
#define GPIO_TASK_PRI (configMAX_PRIORITIES-3)
#define GPIO_TASK_SIZE (1024U/sizeof(configSTACK_DEPTH_TYPE))

StackType_t gMainTaskStack[MAIN_TASK_SIZE] __attribute__((aligned(32)));
StaticTask_t gMainTaskObj;
TaskHandle_t gMainTask;

StackType_t gI2CTaskStack[I2C_TASK_SIZE] __attribute__((aligned(32)));
StaticTask_t gI2CTaskObj;
TaskHandle_t gI2CTask;

StackType_t gGPIOTaskStack[GPIO_TASK_SIZE] __attribute__((aligned(32)));
StaticTask_t gGPIOTaskObj;
TaskHandle_t gGPIOTask;

void empty_main_i2c(void *arg0);
void gpio_led_blink_main(void *args);
void *empty_main_spi(void *arg0);

void freertos_main(void *args)
{
    int32_t status = SystemP_SUCCESS;

    /* Open drivers */
    Drivers_open();
    /* Open flash and board drivers */
    status = Board_driversOpen();
    DebugP_assert(status == SystemP_SUCCESS);

    /* Create the hello world task */
    gI2CTask = xTaskCreateStatic(empty_main_i2c,    /* Pointer to the task function */
                                   "empty_main_i2c",  /* Task name for debugging */
                                   I2C_TASK_SIZE,     /* Stack size */
                                   NULL,                /* Task parameter */
                                   I2C_TASK_PRI,      /* Task priority */
                                   gI2CTaskStack,     /* Stack buffer */
                                   &gI2CTaskObj);     /* Task control block */
    configASSERT(gI2CTask != NULL);

    /* Create the beautiful task */
    gGPIOTask = xTaskCreateStatic(gpio_led_blink_main,    /* Pointer to the task function */
                                       "gpio_led_blink_main",  /* Task name for debugging */
                                       GPIO_TASK_SIZE,/* Stack size */
                                       NULL,              /* Task parameter */
                                       GPIO_TASK_PRI, /* Task priority */
                                       gGPIOTaskStack,/* Stack buffer */
                                       &gGPIOTaskObj);/* Task control block */
    configASSERT(gGPIOTask != NULL);

    empty_main_spi(NULL);

    /* Close board and flash drivers */
    Board_driversClose();
    /* Close drivers */
    Drivers_close();

    vTaskDelete(NULL);
}

int main()
{
    /* init SOC specific modules */
    System_init();
    Board_init();

    /* This task is created at highest priority, it should create more tasks and then delete itself */
    gMainTask = xTaskCreateStatic(freertos_main,   /* Pointer to the function that implements the task. */
                                  "freertos_main", /* Task name for debugging */
                                  MAIN_TASK_SIZE,  /* Stack size */
                                  NULL,            /* Task parameter */
                                  MAIN_TASK_PRI,   /* Task priority */
                                  gMainTaskStack,  /* Stack buffer */
                                  &gMainTaskObj);  /* Task control block */
    configASSERT(gMainTask != NULL);

    /* Start the scheduler to start the tasks executing. */
    vTaskStartScheduler();

    /* This line should never be reached */
    DebugP_assertNoLog(0);

    return 0;
}


这可以使用单个主文件来实现吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Shreyan、您好!

    感谢您访问德州仪器(TI) E2E 支持论坛。

    上述代码可编写到单个 main.c 文件中。

    您能解释一下为什么要将所有代码保存在一个文件中吗?

    在执行相同操作时是否会遇到任何问题?

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tushar:

    如何 在单个主文件中实现这3个函数的多线程化?

    此致、

    Shreyan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Shreyan、您好!

    我可以在上面提供的代码中看到您创建了3个任务、我觉得可以。

    此操作是否出现构建错误、或者任务是否未运行?

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tushar:
    是否可以将这3个任务放在单个文件中并调用该文件的 main 函数?
    我希望实现线程、但不在 main.c 文件中、而是在 empty.c 中

    此致、

    Shreyan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Shreyan、您好!

    上述实现方式不正确。

    首先我们需要创建所有任务、然后我们需要启动 RTOS 计时器。 在你的实现中、首先你启用 RTOS 启动计时器、然后是一个任务创建任务。

    如果你想在 empty.c 文件中创建所有任务、然后从 main.c 文件中调用一个函数。

    调用实现必须在 empty.c 文件中包含所有任务初始化。

    请查看下面的代码以供参考。

    main.c file 
    
    int main()
    {
        /* init SOC specific modules */
        System_init();
        Board_init();
    
    
        Tasks_init();
    
        /* This line should never be reached */
        DebugP_assertNoLog(0);
    
        return 0;
    }
    
    empty.c file : 
    
    void Tasks_init(void *args)
    {
        int32_t status = SystemP_SUCCESS;
    
     
    
        /* Create the hello world task */
        gI2CTask = xTaskCreateStatic(empty_main_i2c,    /* Pointer to the task function */
                                       "empty_main_i2c",  /* Task name for debugging */
                                       I2C_TASK_SIZE,     /* Stack size */
                                       NULL,                /* Task parameter */
                                       I2C_TASK_PRI,      /* Task priority */
                                       gI2CTaskStack,     /* Stack buffer */
                                       &gI2CTaskObj);     /* Task control block */
        configASSERT(gI2CTask != NULL);
    
        /* Create the beautiful task */
        gGPIOTask = xTaskCreateStatic(gpio_led_blink_main,    /* Pointer to the task function */
                                           "gpio_led_blink_main",  /* Task name for debugging */
                                           GPIO_TASK_SIZE,/* Stack size */
                                           NULL,              /* Task parameter */
                                           GPIO_TASK_PRI, /* Task priority */
                                           gGPIOTaskStack,/* Stack buffer */
                                           &gGPIOTaskObj);/* Task control block */
        configASSERT(gGPIOTask != NULL);
    
    
            /* This task is created at highest priority, it should create more tasks and then delete itself */
        gMainTask = xTaskCreateStatic(freertos_main,   /* Pointer to the function that implements the task. */
                                      "freertos_main", /* Task name for debugging */
                                      MAIN_TASK_SIZE,  /* Stack size */
                                      NULL,            /* Task parameter */
                                      MAIN_TASK_PRI,   /* Task priority */
                                      gMainTaskStack,  /* Stack buffer */
                                      &gMainTaskObj);  /* Task control block */
        configASSERT(gMainTask != NULL);
    
    
        
        /* Start the scheduler to start the tasks executing. */
        vTaskStartScheduler
    
    
    }
    
    
    void empty_main_i2c(void)
    {
    
       while(1)
       {
       
       }
    }
    
    
    void gpio_led_blink_main(void)
    {
    
       while(1)
       {
       
       }
    }
    
    
    
    void freertos_main(void)
    {
    
       while(1)
       {
       
       }
    }
    
    

    此致、


    Anil。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Anil:

    In the main.c file I gave,the vTaskStartScheduler(); is after main,so doesn't it start RTOS timer after the tasks have been created?
    Regards,


    Shreyan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Anil:

    您可以看看这个问题吗?

    此致、

    Shreyan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     Shreyan、您好!

    在每1秒的每个任务中、 打印一些 UART 日志、并查看任务切换是否发生。

    此致、

    Anil。