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.

[参考译文] CCS/CC2640:从未调用过任务函数

Guru**** 2467400 points
Other Parts Discussed in Thread: CC2650STK, CC2640

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/762083/ccs-cc2640-task-functions-never-called

器件型号:CC2640
主题中讨论的其他器件:CC2650STK

工具/软件:Code Composer Studio

您好!

我正在为 cc2640 目标开发 BLE 应用。

我能够成功构建该应用。 我可以打开 CCS 调试窗口、并通过 XDS110调试探针通过 JTAG 电缆将应用二进制文件成功加载到目标中。  

我使用的是 TI RTOS  V2.20.01.08、BLE 堆栈 V2.01.18、编译器版本 v5.2.5

现在,在主函数中调用 BIOS_start()后,除 iCall_taskEntry 和空闲任务外,所有创建的任务都不会运行。 所有其它任务显示为“就绪”,但从不执行。(如下所示)

我找不到 问题所在。

1) 1) iCall_taskEntry 函数是否存在任何问题?
2) 2)请分享解决此问题的指针。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您开始的项目是什么?
    您对该项目进行了哪些修改?
    您能否将代码剥离以查看在项目中添加了什么之后、会发生这种情况?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

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

       您好!

      

    我们从 Sensortag_cc2650stk_app 开始、该应用程序作为 BLE 应用示例提供。

    我们实施了运动传感器 GATT 配置文件。

    下图显示了主代码流。 我们已启用 GAP 角色任务和 SensorTag 应用任务(运动传感器)。

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

    你(们)好   

    您能否就我所附的代码共享一些指针?

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

    您是否修改了 SensorTag_createTask 的内容?

    您是否对 BIM 项目进行了编程?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    1) 1)我们已修改此任务的 init 和 task_fxn、以管理基于 SPI 的移动传感器。

    任务已成功创建并处于就绪状态。 调用 BIOS_start()时,执行应该已经进入任务的 init 函数。

    但是、初始化函数根本不会被调用、尽管我们在该初始化函数内的第一行设置了断点。

    2) 2)我们正在使用 FLASHROM.not with flashOnly"进行刷写、因此我们尚未对 BIM 项目进行编程
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Christin Lee:

    我们对这个问题感到震惊,无法继续下去。  

    我们需要获取一些指针,说明为什么在 BIOS_start()之后执行没有进入应用程序任务函数(SenTag_taskfxn())

    1)我们将堆大小增加了1000字节(请参阅下面的屏幕截图)。 即使这样、我们也会遇到相同的上述问题。 堆配置是否正常?

      

    2) 2)上面屏幕截图的第一行显示了 cc2640.cfg 文件的导入。 我们怀疑此 cc2640.cfg 文件未正确导入。 如何检查 cc2640.cfg 文件的导入工作正常?

    3) 3)此 cc2640.cfg 文件在 Project Explorer 的 tools 文件夹下不可见(请参阅下面的 Project Explorer 窗口屏幕截图)。 我们认为 cc2640.cfg 未正确导入。 如何使该 cc2640.cfg 文件在 Project Explorer 窗口的 tools 文件夹下可见?

    4) 4) cc2640.cfg 文件在 Project Explorer 包含路径下也不可见(请参阅下图)。 这是可以的吗? 但是、当我们通过 Windows 文件管理器浏览并查看时、此 cc2640.cfg 文件仍位于此包含路径下。



    提前感谢
    此致、
    Roopa Kalmath

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

    您能否根据以下指南第9.6节启用 heapmgr 指标
    www.ti.com/.../swru393

    特别检查 heapmgrMemFail。

    在上面运行的测试中、您正在增加 BIOS heapsize、这可能不是问题的原因。 实际上、这可能会使情况更糟、因为 BIOS 堆大小实际上会收缩 ICall 堆(如果自动调整大小)。 我会恢复此更改并执行上述建议的测试。

    上述指南的第3.11.4节介绍了双堆架构。 HEAPMGR_SIZE 的值是多少?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sean、

    感谢您检查 heapmgr 指标的指针。

    1) 1)我需要在 BIOS_start()之前在主函数中添加 iCall_heapGetMetrics ()函数调用、对吧?。 此函数将返回 heapmgrMemFail 全局变量值、对吧?。 请建议合适的位置来添加此函数调用。

    2) 2)在工程属性的"预定义符号"部分中将 HEAPMGR_SIZE 定义为2872。 这是好吗?

    3) 3)我们现在将恢复 BIOS 堆大小的更改。


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

    1) 1)您可以将 heapmgrMemFail 放在 CCS 监视窗口中、运行处理器直到看到挂起、点击暂停按钮、并在监视窗口中观察变量。 您也可以调用函数、但这种方法更简单。

    2) 2)这在很大程度上取决于您在应用中执行的操作。 来自#1的测试将确定变量是否足够大。 您也可以尝试使用 HEAPMGR_SIZE=0进行测试。 这将为 iCall 堆提供.bss 末尾和 CSTACK/HWI 堆栈开头之间的最大空间。 我建议独立进行这些测试。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sean、

    我已在 CCS 监视窗口中添加了 heapmgrMemFail,并且 在运行后以调试模式运行处理器,当我暂停 在监视窗口中显示未找到变量时。

     它显示了 HWI.C 文件。(Hwi 异常处理程序如下所示)我不知道发生了什么? 然后我 将 HEAPMGR_SIZE 设置为0。

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

    监视窗口区分大小写、您需要将变量完全添加为"heapmgrMemFail"、粘贴""字符之间的所有内容。 在任何情况下、您确实遇到了例外情况。

    您能否按照我在解密 CPU 异常下链接到您的指南中的步骤进行操作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 、Sean2、

     1) 1)我按照 您所说的方式添加了变量 heapmgrMemFail、然后我也获得 了未找到的标识符、如下所示。

    2) 2)我 经历了解密 CPU 异常,CFSR 寄存 器内容如下所示(运行目标之后)

    我不知道是什么问题、您能给出一些建议吗?

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

    您好、Sean2、

    我想我的 Hwi 异常处理程序有问题、如下所示。   我对这家 HWI 处理程序的了解不多  

    您能为 解决此问题提供一些建议吗?

    异常的连续调节:

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

    您好、Sean2、

    我们通过执行闪烁 LED 任务(BlinkLED_createTask)和 ICALL 任务(iCall_createRemoteTasks)来完成了2个测试。

    1) 1)在 main 中、仅启用 BlinkLED_createTask (根据下面的屏幕截图图像)。 在这里 、iCall_createRemoteTasks 被注释掉。  因此,该项目工作正常,没有提出任何例外。 CFSR 寄存器设为全0 (即 CFSR 中无错误)。

    调试窗口屏幕截图图像:

    2)下一次在 main 中、启用了 BlinkLED_createTask 和 iCall_createRemoteTasks (根据下面的屏幕截图图像)。  因此、项目无法正常工作、并引发硬故障异常(请参阅屏幕截图图像)。 在 CFSR 中、INVSTATE 标志被置位。

    调试窗口图像:

    3) 3)对于第1和第2点中的上述测试、我们认为 iCall_createRemoteTasks 存在问题并导致异常。 为供您参考、我们已成功编译了应用程序和堆栈项目。 但是、我们只通过 XDS110 JTAG 调试器探针将应用项目输出文件(sensortag_cc2650stk_app.out)下载到 CC2640目标中。 我们尚未将堆栈输出文件(sensortag_cc2650stk_stack.out)下载到目标中。 我们假设在编译应用程序项目时、应用程序输出文件与堆栈输出相结合。 我们是否正确执行了该操作?


    提前感谢
    Roopa kalmath

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

    UNDEFINSTR 和 INVSTATE 与尝试执行无效指令的器件一致、特别是没有设置 THUMB 位的指令。 CM3中的所有指令必须设置此位。 通常、您可以通过尝试执行无效的函数指针或运行时堆栈溢出导致加载无效指令进入此状态。

    >>我们尚未将堆栈输出文件(sensortag_cc2650stk_stack.out)下载到目标中。 我们假设在编译应用程序项目时、应用程序输出文件与堆栈输出相结合。 我们是否正确执行了该操作?

    这就是问题所在。 堆栈和应用项目作为单独的映像进行编译和链接。 实际上、如果启用了 iCall 任务、则该进程将尝试通过执行 ICALL_STACK0_ADDR 作为 functon 指针来"跳转到"堆栈。 如果您尚未加载堆栈项目、则它将跳转至没有代码的闪存区域(0xFFF...)。


    此处介绍了这一点:
    www.ti.com/.../swru393

    第2-4章介绍了软件架构、第2.7节介绍了如何在需要时使用 Python 合并十六进制文件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sean、

    感谢您的更新。 这次、我们按以下顺序分别编译和刷写了应用程序映像和堆栈映像。

    -构建并刷写堆栈映像、然后按此顺序构建和刷写应用映像

    - ccs_compiler_defins.bcfg 中的 ICALL_STACK0_ADDR (0x11001)匹配应用程序和堆栈项目。

    1) 1)在 main 中、启用 BlinkLED_createTask、iCall_createRemoteTasks 和 GAPRole_createTask。  我们按照上述顺序刷写了堆栈映像和应用映像。 因此、该项目工作正常、没有任何例外。 LED 指示灯闪烁正常。

    2)在 main 中 、启用了 BlinkLED_createTask、iCall_createRemoteTasks、GAPRole_createTask 和 SensorTag_createTask (根据下图)。  我们按照上述顺序刷写了堆栈映像和应用映像。 因此、项目运行不顺利、LED 不闪烁、并出现硬件故障异常:强制:BUSFAULT:PRECISERR.Data Access Error。 地址= 0x10d78。

    我们加载了该异常的 LR 寄存器值((0xfa07)、该值指向 iCall_taskentry 函数、如下图所示。

    调试窗口图像:

    请分享一些解决该 BUSFAULT:PRECISERR 问题的指针。

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

    您好 Sean、

    最后、我们可以解决 BUSFAULT:PRECISERR 问题。 出现此问题的主要原因是应用二进制闪存与堆栈二进制闪存存储器区域重叠。 应用程序和堆栈二进制大小以及闪存区域详细信息如下:

    应用程序二进制闪存空间

        闪存起始地址:0x0

        应用程序二进制大小:66000字节

        闪存结束地址:0x101D0  (此处1D0字节与堆栈闪存空间重叠)

    堆栈二进制闪存空间:

        闪存起始地址:0x11000 (根据 ICALL_STACK0_ADDR)

        栈二进制大小:56000字节

        闪存结束地址:0x1EAC0

    如果仔细看这里、1D0字节会重叠到堆栈闪存空间。 一.e)

    我们优化 了低于66KB 的应用代码大小、以便应用二进制大小不会与堆栈闪存空间重叠。 i.e)应用程序二进制空间与 栈二进制空间分离。 这样、我们可以看到项目工作正常、LED 闪烁。 未提出任何例外。

    1) 1)但克服该 BUSFAULT 错误后、我们遇到了另一个问题。 我们看到 GAP 角色任务运行正常。  但移动应用程序看不到 GAP 广告。 i.e)移动应用程序未列出 BLE 器件的名称以及其他相关的 GAP 广播和扫描响应数据。  我们怀疑、闪存最后一页(0x1E000)被堆栈二进制文件覆盖、因此应用二进制文件无法在0x1E000的闪存最后一页上完全保留 CCA 和 CCFG 内容。

    我是对的吗? 请给我一些提示、以解决移动应用程序无法看到的 GAP 广告问题。

    此致、

    Roopa

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

    >>如果仔细看这里、1D0字节会叠加到堆栈闪存空间中。 一.e)

    堆栈链接器文件(cc26xx_stack.cmd)应该与一个闪存页对齐并且应该根据堆栈的最后地址来相应地设置 ICALL_STACK0_ADDR。

    如果这些不同步、我会怀疑边界工具可能在堆栈侧无法正常运行、您能否确认以下几点:

    1.在对堆栈进行任何更改时、首先重新构建堆栈、然后再重新构建应用程序。 使用 Project > Rebuild All?
    执行上述操作时、您是否注意到 ccs_linker_defines.cmd 和 ccs_compiler_defines.bcfg 的内容已更改?
    3.验证 CCS_linker_defines 是否传递到应用程序的链接器中、以便使用最新版本?


    >>我们看到 GAP 角色任务运行正常。 但移动应用程序看不到 GAP 广告。 i.e)移动应用程序未列出 BLE 器件的名称以及其他相关的 GAP 广播和扫描响应数据。

    您如何验证差距是否正常? 您是否收到 GAPROLE_started 事件?您最终是否处于 GAPROLE_ERROR 或 GAPROLE_WAITING_RUSTING_RUSTING_CTRL 状态? 如果暂停器件(ROV 等)、它的状态是什么?

    >>我们怀疑闪存的最后一页(0x1E000)被堆栈二进制文件覆盖、因此应用二进制文件无法在0x1E000的闪存最后一页上完全保留 CCA 和 CCFG 内容。

    您可以通过手动检查应用程序的映射文件来验证这一点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sean、

    感谢您的更新。

    >>堆栈链接器文件(cc26xx_stack.cmd)应与闪存页对齐,并应根据堆栈的最后地址相应地设置 ICALL_STACK0_ADDR。

    在这里、我们看到 ICALL_STACK0_ADDR 未定义。 但定义了以下关键值:

    #define FLASH_START   0x0

    #define RAM_START    0x20000000

    #define RAM_END      0x200048E7

    请详细解释您说堆栈链接器文件(cc26xx_stack.cmd)应与闪存页面对齐意味着什么。

    >> 1. 每当对堆栈进行任何更改时、首先重新构建堆栈、然后再重新构建应用程序。 使用 Project > Rebuild All?

    我们可以成功地重建堆栈项目、而不会出现任何错误。

    对于应用项目、我们会看到奇怪的行为。 当我们构建应用项目时、构建成功。 请参阅下图。

    但是、当我们重建应用项目时、编译失败、并在 pem3文件中出现错误、如下图所示。

    应用项目构建映像:

    应用项目重建图像:

    1) 1)重建选项可能会出现什么问题?  

    成功构建应用程序和堆栈项目二进制文件后、我们将两者都刷写到目标中。

    这样,我们就会看到 SensorTag_processAppMsg()被成功调用,并且接下来将发生 AppMsg 事件
    按以下顺序排列。
    GAPROLE_started
    GAPROLE_advertising

    我们看到 gapRole_processGAPMsg()正在被成功调用,并且接下来的 GAPMsg 事件也将出现
    按以下顺序排列。
    GAP_DEVICE_INIT_DONE_EVENT
    GAP_ADV_DATA_UPDATE_DONE_EVENT
    GAP_LET_DISCOVERAT_DONE_EVENT

    2) 2)此重建错误是否会导致 GAP 广播对移动应用程序不可见?  

    此致、
    Roopa



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

    >>在这里、我们看到 ICALL_STACK0_ADDR 未定义。 但定义了以下关键值

    应始终定义 iCall_STACK0_ADDR。 如果不是、您可以进入重叠十六进制文件所描述的情况。
    您是否已验证 CCS 链接器定义.cmd 是否传递到 CCS 上的链接器选项? (项目属性->ARM 连接器-->文件搜索路径)

    此时,项目设置似乎有问题。 您能否在全新安装 SDK 的情况下再次尝试此操作、并尝试重现此情况?

    >>请详细解释您说堆栈链接器文件(cc26xx_stack.cmd)应与闪存页面对齐意味着什么。
    在 cc26xx_stack.cmd 中、您具有以下命令、这将强制页面对齐。
    GROUP > FLASH (HIGH) ALIGN PAGE_SIZE

    EntrySection
    应用程序/堆栈之间需要页面对齐。


    >> 1)重建选项可能存在什么问题

    您显示的问题与内核构建时在配置阶段生成的文件有关。 这是应用程序工程的预编译步骤。 同样、从原始示例中看、项目设置似乎已被破坏。 我建议重新开始使用新鲜的。


    >> 2)此重建错误是否导致 GAP 广播对移动应用程序不可见?

    如上所述、显然设置有误、可能导致应用程序无法正常工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    最后、我们可以通过确定以下内容来解决此问题

    在编译堆栈和应用程序之前、我们需要遵循 一些规则

    1) 1) ICALL_STACK0_START 应始终在 cc26xx_app.cmd 中定义(如下图所示)

      

    2) 2)堆栈始终在 ICALL_STACK0_ADDR 之后启动

    3) ccfg (配置文件)应正确地在.out 文件中进行通信

    4)确保应用程序大小小于 ICALL_STACK0_START (查看->内存分配如下所示)

    应用程序的内存分配:

    堆栈的内存分配:

    5) 5)堆栈需要首先刷写、然后需要编译和刷写应用。

    此致、

    Roopa kalmath