硬汉嵌入式论坛

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

[ThreadX全家桶] sleep延时不准

[复制链接]

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2022-4-24 17:58:18 | 显示全部楼层 |阅读模式
测试发现使用tx_thread_sleep()函数延时不准确,比如设置为tx_thread_sleep(500),不稳定,有时会有1-2ms的误差。查看了下移植文件没啥问题,操作系统设置的是tick=1ms,可能是什么问题?谢谢指教。
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2022-4-24 17:59:21 | 显示全部楼层
测试了系统时钟设置正确
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2022-4-24 18:00:36 | 显示全部楼层
测试了系统时钟是正确的,此种情况下重新上电测试又正常了??很奇怪
回复

使用道具 举报

681

主题

3492

回帖

5560

积分

论坛元老

积分
5560
发表于 2022-4-25 14:12:46 | 显示全部楼层
1-2ms 的误差,应该没有什么问题吧,除非你使用绝对延时
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115863
QQ
发表于 2022-4-25 17:50:50 | 显示全部楼层
这个是正常的,因为你调用的时候有时可能会正好时间快到了。其它的就是任务抖动了,这个一般是高优先级任务或者中断抢占造成的。
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2022-4-26 23:33:05 | 显示全部楼层
eric2013 发表于 2022-4-25 17:50
这个是正常的,因为你调用的时候有时可能会正好时间快到了。其它的就是任务抖动了,这个一般是高优先级任务 ...

1、又出现了一个问题,发现所有任务的延时都明显延长了,比如1s占空比50%的LED灯闪烁频率误差明显,测试了一下变成2s多了,且占空比也很不稳定。
2、最高优先级的任务的延时也明显不准确了,1ms的延时有时能够达到100ms左右。
3、通过上述情况好像tick滴答出现问题,检查了下systick寄存器设置没问题,读取了CPU时钟也没有变化。
感觉是系统延时整个都乱了,请大神指导下,可能是哪里的问题?
4.也测试了堆栈是否有溢出,发现堆栈最大使用量是47%
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115863
QQ
发表于 2022-4-27 08:50:06 | 显示全部楼层
lixuanyi 发表于 2022-4-26 23:33
1、又出现了一个问题,发现所有任务的延时都明显延长了,比如1s占空比50%的LED灯闪烁频率误差明显,测试 ...

感觉你这个没有移植好啊,1s变2s,这差太多了。
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2022-4-27 10:46:13 | 显示全部楼层
我感觉也是没移植好,但看了移植步骤,以及注意事项没有查到什么问题。移植也主要是注意_tx_initialize_low_level.s文件的修改,其他的按照步骤添加threadx源文件,还有就是对CPU的初始化部分了(这部分与移植操作系统就没什么关系了)。_tx_initialize_low_level(VOID)文件修改后的内容如下



@
    .global     _tx_thread_system_stack_ptr
    .global     _tx_initialize_unused_memory
    .global     _tx_timer_interrupt
    .global     __main
    .global     __tx_SVCallHandler
    .global     __tx_PendSVHandler
    .global     __tx_NMIHandler                     @ NMI
    .global     __tx_BadHandler                     @ HardFault
    .global     __tx_SVCallHandler                  @ SVCall
    .global     __tx_DBGHandler                     @ Monitor
    .global     __tx_PendSVHandler                  @ PendSV
    .global     __tx_SysTickHandler                 @ SysTick
    .global     __tx_IntHandler                     @ Int 0
               
   @; .global     |Image$$ARM_LIB_STACK$$ZI$$Limit|                        @//;2022-2-14*/
    .global     Image$$ARM_LIB_STACK$$ZI$$Limit                        @//;2022-4-22*/

        .global     __Vectors       
               
               
               
               
@
@
SYSTEM_CLOCK      =   528000000
SYSTICK_CYCLES    =   ((SYSTEM_CLOCK / 1000) -1)

    .text 32
    .align 4
    .syntax unified
@/**************************************************************************/
@/*                                                                        */
@/*  FUNCTION                                               RELEASE        */
@/*                                                                        */
@/*    _tx_initialize_low_level                          Cortex-M7/AC6     */
@/*                                                           6.1          */
@/*  AUTHOR                                                                */
@/*                                                                        */
@/*    William E. Lamie, Microsoft Corporation                             */
@/*                                                                        */
@/*  DESCRIPTION                                                           */
@/*                                                                        */
@/*    This function is responsible for any low-level processor            */
@/*    initialization, including setting up interrupt vectors, setting     */
@/*    up a periodic timer interrupt source, saving the system stack       */
@/*    pointer for use in ISR processing later, and finding the first      */
@/*    available RAM memory address for tx_application_define.             */
@/*                                                                        */
@/*  INPUT                                                                 */
@/*                                                                        */
@/*    None                                                                */
@/*                                                                        */
@/*  OUTPUT                                                                */
@/*                                                                        */
@/*    None                                                                */
@/*                                                                        */
@/*  CALLS                                                                 */
@/*                                                                        */
@/*    None                                                                */
@/*                                                                        */
@/*  CALLED BY                                                             */
@/*                                                                        */
@/*    _tx_initialize_kernel_enter           ThreadX entry function        */
@/*                                                                        */
@/*  RELEASE HISTORY                                                       */
@/*                                                                        */
@/*    DATE              NAME                      DESCRIPTION             */
@/*                                                                        */
@/*  09-30-2020     William E. Lamie         Initial Version 6.1           */
@/*                                                                        */
@/**************************************************************************/
@VOID   _tx_initialize_low_level(VOID)
@{
    .global  _tx_initialize_low_level
    .thumb_func
_tx_initialize_low_level:
@
@    /* Disable interrupts during ThreadX initialization.  */
@
    CPSID   i
@
@    /* Set base of available memory to end of non-initialised RAM area.  */
@
    LDR     r0, =_tx_initialize_unused_memory       @ Build address of unused memory pointer
    LDR     r1, = Image$$ARM_LIB_STACK$$ZI$$Limit                      @ Build first free address
    ADD     r1, r1, #4                              @
    STR     r1, [r0]                                @ Setup first unused memory pointer
@
@    /* Setup Vector Table Offset Register.  */
@
    MOV     r0, #0xE000E000                         @ Build address of NVIC registers
    LDR     r1, = __Vectors   @;2022-2-14 vector_table                       @ Pickup address of vector table
    STR     r1, [r0, #0xD08]                        @ Set vector table address
@
@    /* Set system stack pointer from vector value.  */
@
    LDR     r0, =_tx_thread_system_stack_ptr        @ Build address of system stack pointer
    LDR     r1, =__Vectors  @;vector_table                       @ Pickup address of vector table
    LDR     r1, [r1]                                @ Pickup reset stack pointer
    STR     r1, [r0]                                @ Save system stack pointer
@
@    /* Enable the cycle count register.  */
@
    LDR     r0, =0xE0001000                         @ Build address of DWT register
    LDR     r1, [r0]                                @ Pickup the current value
    ORR     r1, r1, #1                              @ Set the CYCCNTENA bit
    STR     r1, [r0]                                @ Enable the cycle count register
@
@    /* Configure SysTick for 100Hz clock, or 16384 cycles if no reference.  */
@
    MOV     r0, #0xE000E000                         @ Build address of NVIC registers
    LDR     r1, =SYSTICK_CYCLES
    STR     r1, [r0, #0x14]                         @ Setup SysTick Reload Value
    MOV     r1, #0x7                                @ Build SysTick Control Enable Value
    STR     r1, [r0, #0x10]                         @ Setup SysTick Control
@
@    /* Configure handler priorities.  */
@
    LDR     r1, =0x00000000                         @ Rsrv, UsgF, BusF, MemM
    STR     r1, [r0, #0xD18]                        @ Setup System Handlers 4-7 Priority Registers

    LDR     r1, =0xFF000000                         @ SVCl, Rsrv, Rsrv, Rsrv
    STR     r1, [r0, #0xD1C]                        @ Setup System Handlers 8-11 Priority Registers
                                                    @ Note: SVC must be lowest priority, which is 0xFF

    LDR     r1, =0x40FF0000                         @ SysT, PnSV, Rsrv, DbgM
    STR     r1, [r0, #0xD20]                        @ Setup System Handlers 12-15 Priority Registers
                                                    @ Note: PnSV must be lowest priority, which is 0xFF
@
@    /* Return to caller.  */
@
    BX      lr
@}
@

@/* Define shells for each of the unused vectors.  */;;2022-2-14
@
    .global  __tx_BadHandler
    .thumb_func
__tx_BadHandler:
    B       __tx_BadHandler

@ /* added to catch the hardfault */

    .global  __tx_HardfaultHandler
    .thumb_func
__tx_HardfaultHandler:
    B       __tx_HardfaultHandler


@ /* added to catch the SVC */

    .global  __tx_SVCallHandler
    .thumb_func
__tx_SVCallHandler:
    B       __tx_SVCallHandler


@ /* Generic interrupt handler template */
    .global  __tx_IntHandler
    .thumb_func
__tx_IntHandler:
@ VOID InterruptHandler (VOID)
@ {
    PUSH    {r0, lr}
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
    BL      _tx_execution_isr_enter             @ Call the ISR enter function
#endif

@    /* Do interrupt handler work here */
@    /* BL <your C Function>.... */

#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
    BL      _tx_execution_isr_exit              @ Call the ISR exit function
#endif
    POP     {r0, lr}
   BX      LR
@ }

@ /* System Tick timer interrupt handler */
    .global  __tx_SysTickHandler
    .global  SysTick_Handler
    .thumb_func
__tx_SysTickHandler:
    .thumb_func
SysTick_Handler:
@ VOID TimerInterruptHandler (VOID)
@ {
@
    PUSH    {r0, lr}
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
    BL      _tx_execution_isr_enter             @ Call the ISR enter function
#endif
    BL      _tx_timer_interrupt
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
    BL      _tx_execution_isr_exit              @ Call the ISR exit function
#endif
    POP     {r0, lr}
    BX      LR
@ }


@ /* NMI, DBG handlers */;;2022-2-14
    .global  __tx_NMIHandler
    .thumb_func
__tx_NMIHandler:
    B       __tx_NMIHandler

    .global  __tx_DBGHandler
    .thumb_func
__tx_DBGHandler:
    B       __tx_DBGHandler
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-23 19:02 , Processed in 0.645815 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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