硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3024|回复: 13
收起左侧

[RTOS] 用了RTX5怎么再用HAL_DELAY()函数呢?

[复制链接]

14

主题

99

回帖

141

积分

初级会员

积分
141
发表于 2020-4-24 17:01:08 | 显示全部楼层 |阅读模式
是不是不用在任务里面添加延时函数就可以切换任务了,那么想用HAL_DELAY()函数怎么办呢?
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2020-4-24 20:13:35 | 显示全部楼层
貌似 历程里面有说明及使用方法
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-4-24 20:15:39 | 显示全部楼层
任意下载一个V7里面带RTX5例子,直接就可以使用。

如果此函数要在中断里面调用,将bsp.C文件末尾的条件编译打开。
回复

使用道具 举报

14

主题

99

回帖

141

积分

初级会员

积分
141
 楼主| 发表于 2020-4-24 21:31:58 | 显示全部楼层
eric2013 发表于 2020-4-24 20:15
任意下载一个V7里面带RTX5例子,直接就可以使用。

如果此函数要在中断里面调用,将bsp.C文件末尾的条件 ...

我现在是在已经使用的工程上想移植RTX5,里面有很多调用delay函数的
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2020-4-26 12:58:22 | 显示全部楼层
uint32_t HAL_GetTick(void) {         return osKernelGetTickCount(); }  加上这一句,原有的HAL_Delay就可以了
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2023-10-19 11:15:29 | 显示全部楼层
旮旯旭 发表于 2020-4-26 12:58
uint32_t HAL_GetTick(void) {         return osKernelGetTickCount(); }  加上这一句,原有的HAL_Delay就可以了

你这个用法有问题。 在RTOS没有开始启动任务调度器的时候,HAL_Delay()就不能使用。

以前的配置,在初始化HAL_Init();后,就可以使用HAL_Delay()的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-10-19 11:34:38 | 显示全部楼层
caicaptain2 发表于 2023-10-19 11:15
你这个用法有问题。 在RTOS没有开始启动任务调度器的时候,HAL_Delay()就不能使用。

以前的配置,在初 ...

坛友没有贴完整,完整的是这样的。

[C] 纯文本查看 复制代码
HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority)
{
        return HAL_OK;
}

uint32_t HAL_GetTick (void)
{
        static uint32_t ticks = 0U;
        uint32_t i;

        /* RTX5启动后使用 */
        if (osKernelGetState () == osKernelRunning)
        {
                return ((uint32_t)osKernelGetTickCount ());
        }

        /* RTX5启动前使用  */
        for (i = (SystemCoreClock >> 14U); i > 0U; i--)
        {
                __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
                __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
        }
        
        return ++ticks;
}

回复

使用道具 举报

3

主题

70

回帖

79

积分

初级会员

积分
79
发表于 2023-10-19 13:23:06 | 显示全部楼层
贴过更高效的。
[C] 纯文本查看 复制代码
/**
  * @brief  The CMSIS system tick IRQ ACK hook.
  * @retval int
  */
int32_t  OS_Tick_AcknowledgeIRQ (void) {
  (void)SysTick->CTRL;

  HAL_IncTick();
  return (0);
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-10-19 14:19:44 | 显示全部楼层
turnip 发表于 2023-10-19 13:23
贴过更高效的。
[mw_shl_code=c,true]/**
  * @brief  The CMSIS system tick IRQ ACK hook.

这种方式应该没有处理OS启动前用到HAL库时,延迟处理问题。
回复

使用道具 举报

3

主题

70

回帖

79

积分

初级会员

积分
79
发表于 2023-10-19 15:33:39 | 显示全部楼层
eric2013 发表于 2023-10-19 14:19
这种方式应该没有处理OS启动前用到HAL库时,延迟处理问题。

处理过,os启动前是可以用HAL_DELAY()。你可以看看RTX5的源码,OS_Tick_AcknowledgeIRQ 是systick ISR()里调用的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-10-20 00:56:46 | 显示全部楼层
turnip 发表于 2023-10-19 15:33
处理过,os启动前是可以用HAL_DELAY()。你可以看看RTX5的源码,OS_Tick_AcknowledgeIRQ 是systick ISR() ...

这样的话会有一个问题,在OS启动前,就执行了滴答中断,滴答中断里面有很多OS本身的处理,这样不太好。

[C] 纯文本查看 复制代码
SysTick_Handler PROC
                EXPORT   SysTick_Handler
                IMPORT   osRtxTick_Handler

                PUSH     {R0,LR}                ; Save EXC_RETURN
                BL       osRtxTick_Handler      ; Call osRtxTick_Handler
                POP      {R0,LR}                ; Restore EXC_RETURN
                MRS      R12,PSP                ; Save PSP to R12
                B        SVC_Context            ; Branch to context handling

                ALIGN
                ENDP

                END


[C] 纯文本查看 复制代码
oid osRtxTick_Handler (void) {
  os_thread_t *thread;

  OS_Tick_AcknowledgeIRQ();
  osRtxInfo.kernel.tick++;

  // Process Thread Delays
  osRtxThreadDelayTick();

  osRtxThreadDispatch(NULL);

  // Process Timers
  if (osRtxInfo.timer.tick != NULL) {
    osRtxInfo.timer.tick();
  }

  // Check Round Robin timeout
  if (osRtxInfo.thread.robin.timeout != 0U) {
    thread = osRtxInfo.thread.run.next;
    if (thread != osRtxInfo.thread.robin.thread) {
      osRtxInfo.thread.robin.thread = thread;
      if (thread->delay == 0U) {
        // Reset Round Robin
        thread->delay = osRtxInfo.thread.robin.timeout;
      }
    }
    if (thread->delay != 0U) {
      thread->delay--;
    }
    if (thread->delay == 0U) {
      // Round Robin Timeout
      if (osRtxKernelGetState() == osRtxKernelRunning) {
        thread = osRtxInfo.thread.ready.thread_list;
        if ((thread != NULL) && (thread->priority == osRtxInfo.thread.robin.thread->priority)) {
          osRtxThreadListRemove(thread);
          osRtxThreadReadyPut(osRtxInfo.thread.robin.thread);
          EvrRtxThreadPreempted(osRtxInfo.thread.robin.thread);
          osRtxThreadSwitch(thread);
          osRtxInfo.thread.robin.thread = thread;
          thread->delay = osRtxInfo.thread.robin.timeout;
        }
      }
    }
  }
}



回复

使用道具 举报

3

主题

70

回帖

79

积分

初级会员

积分
79
发表于 2023-10-20 08:57:54 | 显示全部楼层
SysTick在HAL_Init()中就启用了,不然默认HAL_DELAY()本身就不能用。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-10-20 09:35:19 | 显示全部楼层
turnip 发表于 2023-10-20 08:57
SysTick在HAL_Init()中就启用了,不然默认HAL_DELAY()本身就不能用。

对,就是这个问题,他启动的是RTX5的滴答中断处理,这个有点问题了。
回复

使用道具 举报

3

主题

20

回帖

29

积分

新手上路

积分
29
发表于 2023-10-23 13:02:29 | 显示全部楼层
把HAL的时钟设置为别的定时器,不用systick不就好了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 04:38 , Processed in 0.306428 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表