您好!
我的邮箱存在某种内存分配问题、但我不确定问题出在何处。 我在 main 中创建邮箱/信标等、将句柄捆绑在结构中(需要传递超过2个参数)、并通过 arg1参数将它们传递给线程。 创建线程并启动 BIOS。 到目前为止一切顺利。 一旦我达到射频内核设置的点、即频率同步、
globalRfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
RF_postCmd(globalRfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
包含邮箱句柄的结构的部分被覆盖、一旦我调用邮箱发布/挂起、程序显然会进入硬故障处理程序。 在"Memory Browser"中、结构的地址是0x20004fb4、靠近指定_stack 的区域的末尾(从0x20004c00开始直到0x20004fff、此时开始是某种存储器锁定区域)。 什么是__stack? 该重复内容的前半部分用0xBE 字节填充、其余部分则填充在 main 中创建的信标句柄等。
我玩了一个线程 PRIOOS 和禁用/启用某些线程、并且传递邮箱/信标句柄似乎可以正常工作、直到我将 cmdFS 发布到无线电中。 此时、一些(但不是全部)(总共约20到30字节) 似乎随机写入与包含所有句柄的结构相同的区域。 所需要的是、没有一个大块被覆盖、而是这里和那里有几个字节。 所以、大多数信标/邮箱仍然可以工作、而其他信标则不工作(但这个可重现、即我的 TxMailbox 不工作、而 Rx 邮箱工作)。
我在 SRAM 上受到了一定的限制、"Memory Allocation"视图(在 CCS 中)告诉我、我将使用大约20kB 的90-95%的 SRAM、具体取决于实现方式。 我确实单独检查了任务堆栈要求、并与正在运行的其他线程组合检查、 至少在可能的情况下检查并相应地调整了堆栈大小。 即、让所有内容运行几分钟、在 ROV 任务视图中选中 maxStackSize 并相应地调整堆栈大小、通常有100个字节左右的剩余空间、但在问题发生之前、我绝不会超过任何任务堆栈。 我的确将堆从0x1000字节减少到了0xbb8字节、但是 ROV 仍然告诉我应该仍然有0x360字节可用。
我的主要内容:
/* RTOS header files */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
#include <ti/sysbios/knl/Mailbox.h>
/* TI driver files */
#include <ti/drivers/SPI.h>
#include <ti/drivers/I2C.h>
#include <ti/drivers/ADC.h>
#include <ti/drivers/GPIO.h>
#include <ti/drivers/NVS.h>
/* Own files */
#include "Board.h"
#include "ImageAcquisition.h"
#include "TempAcquisition.h"
#include "RfCommunication.h"
#include "NVMModule.h"
#include "Bloodsensor.h"
#include "MessageObjects.h"
/* Thread stacks */
Char rfTxStack[RF_TX_STACK_SIZE];
Char rfRxStack[RF_RX_STACK_SIZE];
Char rfCtrlStack[RF_CTRL_STACK_SIZE];
Char imgStack[IMG_STACK_SIZE];
Char tmpStack[TMP_STACK_SIZE];
Char bsStack[BS_STACK_SIZE];
int main(void)
{
Board_initGeneral();
GPIO_init();
SPI_init();
ADC_init();
NVS_init();
I2C_init();
nvmData strNvmData;
bool bStatus;
bStatus = NVMRead(&strNvmData);
Mailbox_Handle mbxTxQueue;
Mailbox_Handle mbxRxQueue;
Mailbox_Params mbxParams;
Mailbox_Params_init(&mbxParams);
mbxTxQueue = Mailbox_create(sizeof(ovePktMsg), NO_TX_MBX_MSG, &mbxParams, NULL);
mbxRxQueue = Mailbox_create(sizeof(ovePktMsg), NO_RX_MBX_MSG, &mbxParams, NULL);
rfCfg strRfCfg;
Semaphore_Handle semTxAllowed;
Semaphore_Handle semRxAllowed;
Semaphore_Handle semRxTimeout;
Semaphore_Params semRfParams;
Semaphore_Params_init(&semRfParams);
semRfParams.mode= Semaphore_Mode_BINARY;
semTxAllowed = Semaphore_create(1, &semRfParams, NULL);
semRxAllowed = Semaphore_create(0, &semRfParams, NULL);
semRxTimeout = Semaphore_create(0, &semRfParams, NULL);
telemetryParams strTelemetryParams;
strTelemetryParams.hMbxTxQueue = mbxTxQueue;
strTelemetryParams.hMbxRxQueue = mbxRxQueue;
strTelemetryParams.hNvmData = &strNvmData;
strTelemetryParams.hSemTxAllowed = semTxAllowed;
strTelemetryParams.hSemRxAllowed = semRxAllowed;
strTelemetryParams.hSemRxTimeout = semRxTimeout;
strTelemetryParams.hRfCfg = &strRfCfg;
Task_Params taskParams;
Task_Params_init(&taskParams);
taskParams.stackSize= RF_CTRL_STACK_SIZE;
taskParams.stack = &rfCtrlStack;
taskParams.priority = PRIO_RF_CTRL;
taskParams.arg1 = (UArg) &strTelemetryParams;
Task_create( (Task_FuncPtr) TelemetryControlThread, &taskParams, NULL );
taskParams.stackSize= RF_TX_STACK_SIZE;
taskParams.stack = &rfTxStack;
taskParams.priority = PRIO_RF_TX;
taskParams.arg1 = (UArg) &strTelemetryParams;
Task_create( (Task_FuncPtr) TelemetryTxThread, &taskParams, NULL );
taskParams.stackSize= RF_RX_STACK_SIZE;
taskParams.stack = &rfRxStack;
taskParams.priority = PRIO_RF_RX;
taskParams.arg1 = (UArg) &strTelemetryParams;
Task_create( (Task_FuncPtr) TelemetrySingleRxThread, &taskParams, NULL );
taskParams.stackSize= IMG_STACK_SIZE;
taskParams.stack = &imgStack;
taskParams.priority = PRIO_IMG;
taskParams.arg0 = (UArg) mbxTxQueue;
Task_create( (Task_FuncPtr) ImageAcquisitionThread, &taskParams, NULL );
taskParams.stackSize= TMP_STACK_SIZE;
taskParams.stack = &tmpStack;
taskParams.priority = PRIO_TMP;
taskParams.arg0 = (UArg) mbxTxQueue;
Task_create( (Task_FuncPtr) TempAcquisitionThread, &taskParams, NULL );
taskParams.stackSize= BS_STACK_SIZE;
taskParams.stack = &bsStack;
taskParams.priority = PRIO_BS;
taskParams.arg0 = (UArg) mbxTxQueue;
Task_create( (Task_FuncPtr) BloodsensorAcquisitionThread, &taskParams, NULL );
BIOS_start(); /* start thread scheduling and hope for the best */
return (0);
}
好、更新:
我将主函数更改如下所示:
/* Thread stacks */
#define TEST_STACK_SIZE 800
Char testStack[TEST_STACK_SIZE];
int main(void)
{
Board_initGeneral();
GPIO_init();
SPI_init();
ADC_init();
NVS_init();
I2C_init();
Task_Params taskParams;
Task_Params_init(&taskParams);
taskParams.stackSize= TEST_STACK_SIZE;
taskParams.stack = &testStack;
taskParams.priority = 1;
Task_create( (Task_FuncPtr) TelemetryThread, &taskParams, NULL );
BIOS_start(); /* start thread scheduling and hope for the best */
return (0);
}
基本上是将所有内容从主体之前移动到单个线程,即在治疗遥测线程中启动所有其它线程,此时错误不会发生,就我所知,整个系统运行正常, 即没有硬故障并且 LED 按预期的时间间隔闪烁。
虽然这是进步,现在我更困惑,有点担心我只是幸运,如果我改变了东西,整个事情会再次打破。 在主程序中实例化所有内容时、我是做了一些概念上的错误操作、还是我只是在某个位置幸运/不幸运? 我的行为显然是错误的吗? 很抱歉,如果这有点不连贯,很乐意提供额外信息。

一般信息:CC1310、CCS v11.1、SimpleLink SDK v4.20.XX、TI-RTOS
您好!
最大值