ST意法半导体
直播中

岳臻俊

7年用户 1050经验值
私信 关注
[问答]

如何在1.5.0 p2pServer示例中使用Sequencer和Timer服务器?

一旦我将任务添加到调度程序并将其安排为每 5 秒运行一次,当计时器触发并且定序器尝试运行该任务时,STM32 就会转到硬故障处理程序。
我正在使用来自 STM32CubeWB 1.5.0 的最新示例 BLE_p2pServer,该示例是原样,除了添加“deviceModes.c”:
  • #include "deviceModes.h"
  • void StandbyMode();
  • void QueueStandbyMode();
  • const int SCH_PRIORITY_STANDBY_MODE = CFG_SCH_PRIO_20;
  • uint8_t standbytimerId;
  • #define FIVE_S   (5 * 1000 * 1000 / CFG_TS_TICK_VAL)
  • void RegisterDeviceModes() {
  •   UTIL_SEQ_RegTask(CFG_TASK_STANDBY_MODE, UTIL_SEQ_RFU,StandbyMode);
  •   HW_TS_Create(CFG_TIM_PROC_ID_ISR, &standbyTimerId, hw_ts_Repeated, QueueStandbyMode);
  •   HW_TS_Start(standbyTimerId, FIVE_S);
  • }
  • void QueueStandbyMode() {
  •     UTIL_SEQ_SetTask(1 << CFG_TASK_STANDBY_MODE, SCH_PRIORITY_STANDBY_MODE);
  • }
  • void StandbyMode() {
  •     BSP_LED_Toggle(LED_RED);
  •     HAL_Delay(5);
  •     BSP_LED_Toggle(LED_RED);
  • }
CubeWB1.1.1 中的 p2pServer 示例没有出现此问题 - 为什么会出现这种情况?我们如何在 1.5.0 p2pServer 示例中使用 Sequencer 和 Timer 服务器?
我附上了一个 git repo,它只显示了下载后的 2 个变化:添加一个 Makefile,然后将任务添加到排序器。







回帖(1)

王育来

2023-1-5 11:25:17
也许我在源代码中发现了另一个需要修改的地方。在“utilities_conf.h”文件中,您可以找到以下部分:


  • /******************************************************************************
  • * sequencer
  • * (any macro that does not need to be modified can be removed)
  • ******************************************************************************/
  • #define UTIL_SEQ_INIT_CRITICAL_SECTION( )
  • #define UTIL_SEQ_ENTER_CRITICAL_SECTION( )      UTILS_ENTER_CRITICAL_SECTION( )
  • #define UTIL_SEQ_EXIT_CRITICAL_SECTION( )       UTILS_EXIT_CRITICAL_SECTION( )
  • #define UTIL_SEQ_CONF_TASK_NBR                  (32)
  • #define UTIL_SEQ_CONF_PRIO_NBR                  (2)
  • #define UTIL_SEQ_MEMSET8( dest, value, size )   UTILS_MEMSET8( dest, value, size )

如果您有另一个包含超过默认条目的优先级列表,那么您可能会在调度程序中出现异常,因为没有该任务的条目。我在我自己的项目中尝试了一个额外的优先级,所以我的计数器必须是 3 而不是 2。否则我会遇到硬故障......


  • #define UTIL_SEQ_CONF_PRIO_NBR                  3    /*(2)*/

当在函数 UTIL_SEQ_Run() 中执行以下部分的最后一行时,会发生硬故障:


  • /** remove from all priority mask the task that has been selected to be executed */
  •     for (counter = UTIL_SEQ_CONF_PRIO_NBR; counter; counter--)
  •     {
  •       TaskPrio[counter - 1].priority &= ~(1 << (CurrentTaskIdx));
  •     }
  •     UTIL_SEQ_EXIT_CRITICAL_SECTION( );
  •     /** Execute the task */
  •     TaskCb[CurrentTaskIdx]( );

您应该在 while(1) 循环中调试 UTIL_SEQ_RUN() 函数并检查发生硬故障的位置
举报

更多回帖

发帖
×
20
完善资料,
赚取积分