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/CC2650:Semaphore_pend()暂停程序并导致多条错误消息

Guru**** 2587365 points
Other Parts Discussed in Thread: CC2650

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/595659/rtos-cc2650-semaphore_pend-halting-program-and-leading-to-several-error-messages

器件型号:CC2650

工具/软件:TI-RTOS

您好!

我一直在尝试一个问题、现在我准备将键盘扔到墙上了。 我希望能切实完成这项工作,希望能得到帮助。 下面的代码定义了两个任务。 由于任务1的优先级较高、所以首先执行任务1、然后达到1个 Semaphore_pend ()、此时整个程序暂停(我用一个断点来检查)。我希望控制权被发送到任务2 ( 这里具有较低的优先级)。 如果我注释掉任务2的定义行(其中设置了参数并且调用了 Task_construct()),则代码执行正常(只有我需要运行任务2!)

我的目标:开始执行任务1、pend()任务,输入任务2,一个 ALERT ()/INTERRUPT 被称为 Form Sensor Controller,其回调调用 post (),控制返回到任务1,直到下一个 pend()... 重复。

注意:如果我不使用断点并运行代码、我会得到以下错误... 感谢善良的灵魂,他们将努力解决这个问题!

/*
版权所有(c) 2015-2016、德州仪器(TI)公司
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
//

/*
=== empty.c ======
//
//* XDCtools 头文件*/
#include 
#include 
#include 
#include 
#include 
#include 

/* BIOS 头文件*/
#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 

#include "CYC_counterR1.h"
/* TI-RTOS 头文件*/
//#include 
#include 
//#include 
#include 
//#include 

#include "scif.h"
#include "ex_include_tirtos.h"
#define BV (n) (1 <<(n))
//如果使用错误的操作系统设置
#ifndef SCIF_OSAL_TIRTOS_H 生成 SCIF 驱动程序,则显示错误消息
错误"SCIF 驱动程序在此示例中的操作系统配置不正确。 请在 Sensor Controller Studio 项目面板中更改为"TI-RTOS"、然后重新生成驱动程序。"
#endif

//如果使用错误的目标芯片封装
#ifndef SCIF_TARGET_CHICE_PACKAGE_QFN48_7X7_RGZ 生成 SCIF 驱动程序,则显示错误消息
错误"SCIF 驱动程序在本示例中具有不正确的目标芯片封装配置。 请在 Sensor Controller Studio 项目面板中更改为"QFN48 7x7 RGZ"、然后重新生成驱动程序。"
#endif

//电路板头文件*/
#include "Board.h"
#include "l_list.h"

//#define SERIALSTACK 2048
#define CYCSTACK
2048 #define LIDARSTACK

CHAR MSg[64];//保持消息
CHAR OUT[64];//保持输出消息
_Bool READ_AL_RECOL = 0
;//
初始 char = 0;
// //可以删除
long serial_time = 0;
long serial_dist = 0;
long serial_sensor = 0;
//
//通过串行读取/写入任务
//任务





_dar serial_task_Struct;//任务 serial_task_0[SERIALSTACK];任务_CYt alGO_Task_Struct];任务_Struct_Struct_char serial_task_task_结构;任务_task_task_task_cht_task_task_cht_task_task_cht_task_t_chtask_t_ch
char lidar_task_2[LIDARSTACK];

Semaphore_StructSemStruct;
Semaphore_Handle;

UART_Handle comm_handle;//堆句柄
UART_Params comm_params;//通信参数

HeapBuf_Params comm_params;
HeapBuf_handle memory_heap;
//堆处理 If_extern

;extern Error;堆处理组处理外部统计数据;处理外部


void scCtrlReadyCallback (void){

}// scCtrlReadyCallback

void scTaskAlertCallback (void){

//唤醒操作系统任务
Semaphore_post (semHandle);

}// scTaskAlertCallback

void format_msg ()
{
static char * token = NULL;
token = strtok (msg、"、");//获取 time
serial_time = atol (token);//通过指针
标记存储时间= strtok (NULL、"、");//获取时间

串行标记= atol (token);//通过指针标记存储距离! //获取传感器
serial_sensor = atol (token);//通过指针
标记存储传感器= NULL;

}


void format_count_data ()
{
int size = sizeof (data_out)/sizeof (int);

static char longbubuy[15];

sprintf (longbuff、"%d"、time_out);

strcat (out、longbuff);//将时间转换为 char 数组、将其存储在 msg
strcat (out、"、")中;//添加一个逗号
静态 int k = 0;//用于迭代,仅为

(k=0;k)声明/创建一次 "%i",="" data_out[k]);="" strcat(out,="" longbuff);="" stores="" all="" data="" in="" char="" array="" if="" (k="" !="(size" -="" 1))="" ",");="" delimiter="" }="" k="0;" "!");="" final="" void="" lidar_task(uarg="" arg0,="" uarg="" arg1)="" static="" uint16_t="" dist1="0;" initialize="" the="" sensor="" controller="" scifosalinit();="" scifosalregisterctrlreadycallback(scctrlreadycallback);="" scifosalregistertaskalertcallback(sctaskalertcallback);="" scifinit(&scifdriversetup);="" set="" task="" tick="" interval="" to="" 1="" millisecond="" scifstartrtcticksnow(0x00010000);="" scifstartrtcticksnow(65);="" configure="" trigger="" interrupt="" at="" first="" result,="" and="" start="" controller's="" i2c="" light="" (not="" be="" confused="" with="" os="" tasks)="" scifstarttasksnbl(bv(scif_i2c_light_sensor_task_id));="" status="scifTaskData.i2cLightSensor.state.i2cStatus;" (status!="0x00)" system_printf("i2c="" error!!!!\n");="" system_flush();="" uint8_t="" fast_counter="0;" main="" loop="" while="" (1)="" wait="" for="" an="" alert="" callback="" semaphore_pend(semhandle,="" bios_wait_forever);="" clear="" source="" scifclearalertintsource();="" uint32="" t="Clock_getTicks();" add_1(t,="" sciftaskdata.i2clightsensor.output.value[0]);="" add_2(t,="" sciftaskdata.i2clightsensor.output.value[1]);="" scifackalertevents();="" cyc_algo(uarg="" *="" ***setup="" algorithm***="" applies="" initial="" toggle="0;" wl[toggle]="1;" waits="" available="" while(!rm_1(&py_time,="" &py_dist))="" appropriate="" variables="" dist_data[toggle][0]="dist_data[toggle][1];" buff_dist="current_dist" dist_data[toggle][1]="py_dist;" curr_dist="next" dist="" time_data[toggle][7]="time_data[toggle][4];" buffer_time="temp" time="" time_data[toggle][4]="py_time;" temp_time="new" 2="" while(!rm_2(&py_time,="" (bool_cond[toggle][4])="" can="" shift="" =="0)" ?="" 1:0;="" (toggle="=" 0)="" &py_dist)){};="" else="" bool_cond[toggle][4]="1;" sets="" multiplexer="" like="" functionality="" (wl[toggle]="=" 1)="" (while_loop1())="" (output_ready)="" sends="" python="" format_count_data();="" uart_write(comm_handle,="" out,="" strlen(out));="" system_printf("output:="" %s\n",="" out);="" out[0]="\0" ;="" clear_output();="" output_ready="0;" has="" been="" written="" continue;="" 2)="" (while_loop2())="" 3)="" (while_loop3())="" read_write(uarg="" msg[0]="\0" initializes="" have="" no="" contents="" (very="" important!)="" *read_val;="" holds="" read="" value="" rdy[]="r!" ready="" string="" next[]="^d!" "done="" reading"="" system_printf("variables="" up\n");="" create="" a="" uart="" processing="" off.="" uart_params_init(&comm_params);="" comm_params.writedatamode="UART_DATA_BINARY;" comm_params.readdatamode="UART_DATA_BINARY;" comm_params.readreturnmode="UART_RETURN_FULL;" comm_params.readecho="UART_ECHO_OFF;" comm_params.baudrate="115200;" comm_handle="UART_open(Board_UART0," &comm_params);="" system_printf("comm="" set-up\n");="" int="" main(void)="" task_params="" serial_params;="" algo_params;="" lidar_params;="" semaphore_params="" semparams;="" call="" board="" init="" functions="" board_initgeneral();="" board_inituart();="" construct="" write="" thread="" task_params_init(&serial_params);="" serial_params.stacksize="SERIALSTACK;" serial_params.stack="&serial_task_0;" serial_params.priority="1;" task_construct(&serial_task_struct,="" (task_funcptr)read_write,="" &serial_params,="" null);="" test="" task_params_init(&algo_params);="" algo_params.stacksize="CYCSTACK;" algo_params.stack="&algo_task_1;" algo_params.priority="1;" task_construct(&algo_task_struct,="" (task_funcptr)cyc_algo,="" &algo_params,="" lidar="" task_params_init(&lidar_params);="" lidar_params.stacksize="LIDARSTACK;" lidar_params.stack="&lidar_task_2;" lidar_params.priority="2;" task_construct(&lidar_task_struct,="" (task_funcptr)lidar_task,="" &lidar_params,="" semaphore="" object="" use="" as="" resource="" lock,="" inital="" count="" semaphore_params_init(&semparams);="" semparams.mode="Semaphore_Mode_BINARY;" semaphore_construct(&semstruct,="" 0,="" &semparams);="" obtain="" instance="" handle="" semhandle="Semaphore_handle(&semStruct);" declare="" define="" heap="" buf[2560];="" mau,="" cc2650="" this="" is="" bytes="" error_init(&eb);="" heapbuf_params_init(&params);="" params.blocksize="16;" 16="" maus="16" per="" block="" params.numblocks="160;" 160="" blocks="" (16="" bytes)="" params.buf="(Ptr)buf;" buffer="" character="" of="" params.bufsize="2560;" number="" contained="" within="" heap_buff="HeapBuf_create(&params," &eb);="" properties="" system_printf("starting="" bios\n");="" sysmin="" will="" only="" print="" console="" when="" you="" flush="" or="" exit="" init_sens_structs();="" bios="" bios_start();="" return="" (0);="" 

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

    更新:如果我通过 System_printf()和 System_flush()监视每个中断和任务(减慢进程速度),算法将按预期完美运行。 虽然我实际上不想在这里刷新、但正如您所假设的...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    事实证明、第220行调用任务中的函数、使堆栈过载。 我进行了此假设并将函数调用更改为布尔变量、它解决了问题
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    堆中也会出现问题。 调用 BIOS_start 函数后、栈 main()用于 ISR 栈。 调用 BIOS_start 函数后、堆栈会复位到开始位置。 因此、任何已分配的存储器都会发生糟糕的情况。 我将 char buf[2560]设为全局变量而不是局部变量。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能更详细一点、更清楚一点、因为我认为您正在描述我现在遇到的问题。 谢谢你
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是您的选择

    int main (空)

      (笑声)

      char buf[2560];//在 MAU 中、在 CC2650中、这是以字节为单位的

      (笑声)

      HeapBuf_Params_init (&params);

      params.blocksize = 16;// 16 MAU =每个块16字节

      params.numBlocks = 160;// 160个块(16字节/块* 160个块= 2560字节)

      params.buf =(ptr) buf;//将缓冲区存储为字节的字符数组

      params.bufSize = 2560;//缓冲区中包含的字节数

      heap_buff = HeapBuf_create (&params、&EB);//设置堆句柄的所有属性

      堆= HeapBuf_handle_upCast (heap_buff);

      (笑声)

      BIOS_start()

    buf 数组位于 main()使用的堆栈上。 调用 BIOS_start()后,该堆栈将被重置并用作中断的堆栈。 因此、当你从堆中分配一个缓冲区时、你可能会破坏系统堆栈(糟糕的事情!)。 或者您的系统堆栈正在改变(正如它应该改变的那样)并且有可能破坏您分配的块和/或者堆中可用块的链接列表(糟糕的事情!)。  

    您需要将 buf 的定义上移(并将其称为更独特和更有意义的名称)、因此它是一个全局变量。

    char myHeapBuffer[2560]; //在 MAU 中、在 CC2650中、这是以字节为单位的

    int main (空)

      (笑声)

      params.buf =(ptr) myHeapBuffer //将缓冲区存储为字节的字符数组

    这可能是您在其他帖子上看到的问题。

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢。 我将在明天的工作中对此进行更改、并告知您结果!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    因此、我已经完成了您的建议、实际上溢出问题已经消失(您不知道我对它的理解程度)。 最后一个问题是、您可能能够帮助我解决。 BIOS 选项卡中的所有 ROV 错误均已消失(感谢您的提示)、但这两个错误除外(下图)。 可能是什么原因导致了这种情况?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ROV 尝试在结构构建之前解释结构(例如 Task_Structt)并给出错误。 构建调用(例如 Task_con构)后、它被正确显示。 一个例外是、如果您有射频模块、这些错误会继续显示。 它们不是真正的错误。 我们已在一两个月后推出的下一个版本中修复了这一问题。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我听说过这种现象,但是在执行期间(BIOS_start()之后)错误仍然存在,最后当程序停止时,这是 ROV 不断显示的唯一错误。 您认为这里存在一些内存溢出问题吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    看! 您对此也是正确的,一切都正常,我的程序没有停止-我只是没有将 System_flush()放在查看输出的正确位置。 非常感谢!