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.

[参考译文] RTOS/TMS570LC4357:HALCoGen FreeRTOS 项目存在问题

Guru**** 2480155 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/697866/rtos-tms570lc4357-problem-with-halcogen-freertos-project

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

工具/软件:TI-RTOS

你(们)好  

我创建了两个任务:-

一个 用于 检查 FreeRTOS 功能的 xTaskCreate (vTask1)和 xTaskCreateRestricted (vTask2),但当 pro-game 转到 vTask1时,它从那里移动到 prefetchEntry,为什么会这样发生, 如果我删除  了 xTaskCreateRestricted (vTask2)它的工作正常。它是否由于一种特权和用户模式而产生、如果是这样、我如何解决它。

我已经从 HalcogGen 生成了代码/驱动程序、并使用 CCS Studio (版本7)

代码片段:-

#include "hL_sys_common.h"
#include "hL_system.h"

/*用户代码开始(1)*/
/*包含 FreeRTOS 调度程序文件*/
#include "freertos.h"
#include "os_task.h"

/*包含 HET 头文件-系统驱动程序的类型、定义和函数声明*/
#include "hL_het.h"
#include "HL_ESM.h"

extern void blink (void);
任务1的/*堆栈缓冲器*/
//#pragma DATA_ALIGN (stackbuffer、configMINIMAL_STACK_SIZE* sizeof (portSTACK_TYPE))
静态 portSTACK_type stackbuffer[configMINIMAL_STACK_SIZE]__attribute__((aligned (configMINIMAL_STACK_SIZE * sizeof (portSTACK_TYPE))));

/*定义任务句柄*/
xTaskHandle xTask1Handle;
xTaskHandle xTask2Handle;
/*任务函数*/
void vTask1 (void *pvParameters)

/*将高端计时器 GIO 端口 hetPort 引脚方向设置为所有输出*/
//gioSetDirection (hetPORT1、0xFFFFFFFF);

for (;;)

/*使用计时器节拍切换 HET[1]*/
blink();
// gioSetBit (hetPORT1、17、gioGetBit (hetPORT1、17)^ 1);
vTaskDelay (100);


void vTask2 (void *pvParameters)

while (1)

blink();
//sciSend (sciREG1、14、(unsigned char *)"\r\n 任务2:\r\n ");
vTaskDelay (1000);

/*任务1参数*/
静态常量 xTaskParameters xTaskParamters1={
vTask1、//实现任务的函数
(const signed char *)"Blinky"、/*只是一个文本名称、用于帮助调试*/
configMINIMAL_STACK_SIZE、/*堆栈大小*
空、/*要传递给任务函数的参数*/
1、/*任务优先级。 如果任务应在特权状态下运行*/,则设置 portPRIVILEGE_BIT (1|portPRIVILEGE_bit)
stackbuffer、/* Buffer 将用作任务堆栈*/
/* xRegions -最多分配三个单独的内存区域供任务使用,并具有适当的访问权限。*/
/*本示例中未设置区域。 *
{/*基址长度参数*/
{0、0、0}、/*{cReadWriteArray、32、portMPU_region_read_write}、*
{0、0、0}、/*{cReadOnlyArray、32、portMPU_region_read_only}、*
{0、0}/*{cPrivilegedOnlyAccessArray、128、portMPU_region_private_read_write}*/

};
/*用户代码结束*/


/**@fn void main (void)
*@应用程序主函数简介
*
*

/*用户代码开始(2)*/
/*用户代码结束*/


void main (void)

/*用户代码开始(3)*/

/*创建任务1 */
if (xTaskCreateRestricted (&xTaskParamers1、&xTask1Handle)!= pdTRUE)

/*无法创建任务*/
while (1);

/*创建任务2 */
if (xTaskCreate (vTask2、"Task2"、configMINIMAL_STACK_SIZE、NULL、1、&xTask2Handle)!= pdTRUE)

/*无法创建任务*/
while (1);

/*启动调度程序*/
vTaskStartScheduler();

/*永久运行*/
while (1);
/*用户代码结束*/

您能就此提供反馈吗?

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

    您可以使用 CP15故障状态寄存器来查看有关异常的信息、例如异常发生在哪个域中以及引起异常的地址是什么。 这通常有助于确定根本原因。 数据和指令故障状态寄存器可通过 CCS 中的寄存器窗口查看。 Cortex-R5F 的 ARM 用户指南中定义了位定义(搜索 DFSR 和/或 IFSR)。

    ARM 网站上以在线手册或可下载 PDF 的形式提供 ARM 用户指南。

    对于可下载的 PDF 版本:infocenter.arm.com/.../DDI0460D_cortex_r5_r1p2_trm.pdf

    在线版本:infocenter.arm.com/.../index.html
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ramesh、

    是否可以添加内存区域并重试?

    静态 portSTACK_type xTaskStack[configMINIMAL_STACK_SIZE]__attribute__((aligned (configMINIMAL_STACK_SIZE * sizeof (portSTACK_TYPE))));

    /*声明将被创建的受保护任务访问的数组。 任务只能从阵列中读取、而不能写入。 *
    静态 portSTACK_type stackbuffer[configMINIMAL_STACK_SIZE]__attribute__((aligned (configMINIMAL_STACK_SIZE * sizeof (portSTACK_TYPE))));

    /*填写 TaskParameters_t 结构以定义任务。 这是传递给 xTaskCreateRestricted()函数的结构。 *
    静态 const TaskParameters_t xTaskParamters1 =

    vTask1、 /*执行任务的函数*/
    (const signed char *)"Blinky"、/*只是一个文本名称、用于帮助调试*/
    configMINIMAL_STACK_SIZE、 /*堆栈大小*/
    null、 /*要传递给任务函数的参数*/
    1、 /*任务优先级。 如果任务应在特权状态下运行*/,则设置 portPRIVILEGE_BIT (1|portPRIVILEGE_bit)
    xTaskStack、/* puxStackBuffer -用作任务堆栈的数组。 *
    /* xRegions -在这种情况下,实际只使用三个用户可定义区域中的一个。 这些参数用于将区域设置为只读。 *

    /*基址长度参数*/
    {stackbuffer、512、portMPU_region_read_only}、
    { 0、0、0}、
    { 0、0、0}、

    };

    void main( void )

    /*创建由 xTaskParamter1定义的任务。 空用作第二个参数、因为不需要任务句柄。 *
    if (xTaskCreateRestricted (&xTaskParamers1、&xTask1Handle)!= pdTRUE)

    /*无法创建任务*/
    while (1);

    /*启动调度程序。 *
    vTaskStartScheduler();
    /*不应该来这里! *
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    谢谢你。
    这对我很有用。