硬汉嵌入式论坛

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

[ThreadX全家桶] threadx API 执行速度测试

[复制链接]

14

主题

65

回帖

107

积分

初级会员

积分
107
发表于 2021-6-9 13:49:05 | 显示全部楼层 |阅读模式
本帖最后由 apleilx 于 2021-6-9 13:57 编辑

一直以为队列是RTOS任务同步速度最慢的API,今天特地测试了下threadx任务同步直接颠覆了我的认知。

测试分为两部分,请求同步的任务为最高优先级,发送同步的分别为低优先级任务和ISR。

测试平台 IAR8.401。 芯片AT32F407,程序在0等待区执行。

程序执行时钟数通过 DWT获取:
  1. #define bsp_cpu_clks_get()    DWT->CYCCNT
复制代码


时间统计变量

  1. typedef struct
  2. {
  3.     volatile uint32_t u_tick;
  4.     volatile uint32_t powerup_time_cnt;

  5.     timer_pulse_type pulse;
  6.     sig_time_type sig_time;
  7.     TIME_Type rtc_time;
复制代码



高优先级任务等待
  1. while (1)
  2.         {
  3.        bsp_dwt_check();
  4.         
  5.                 // 信号量测试
  6.                 sys_st.api_tick.sem_req = 1;
  7.                 tx_semaphore_get(&os_obj.sem_tst, TX_WAIT_FOREVER);
  8.                 sys_st.api_tick.sem_rcv_tick = bsp_cpu_clks_get();
  9.                 sys_st.api_tick.sem_tick_amount =
  10.                         sys_st.api_tick.sem_rcv_tick - sys_st.api_tick.sem_send_tick;
  11.                
  12.                 // 事件组测试
  13.                 sys_st.api_tick.event_req = 1;
  14.                 tx_event_flags_get(&os_obj.event_tst,
  15.                                                    0xFFFF,
  16.                                                    TX_OR_CLEAR,
  17.                                                    &sys_st.api_tick.event_dat ,
  18.                                                    TX_WAIT_FOREVER);
  19.                 sys_st.api_tick.event_rcv_tick = bsp_cpu_clks_get();
  20.                 sys_st.api_tick.event_tick_amount =
  21.                         sys_st.api_tick.event_rcv_tick - sys_st.api_tick.event_send_tick;
  22.                
  23.                 // 队列测试
  24.                 sys_st.api_tick.quene_req = 1;
  25.                 tx_queue_receive(&os_obj.quene_tst,
  26.                                                  sys_st.api_tick.quene_dat,
  27.                                                  TX_WAIT_FOREVER);
  28.                 sys_st.api_tick.quene_rcv_tick = bsp_cpu_clks_get();
  29.                 sys_st.api_tick.quene_tick_amount =
  30.                         sys_st.api_tick.quene_rcv_tick - sys_st.api_tick.quene_send_tick;
  31.                
  32.                 // 互斥量获取
  33.                 /*
  34.                 sys_st.api_tick.mutex_req_tick = bsp_cpu_clks_get();
  35.                 tx_mutex_get(&os_obj.mutex_common, TX_WAIT_FOREVER);
  36.                 sys_st.api_tick.mutex_get_tick_amount = bsp_cpu_clks_get() - sys_st.api_tick.mutex_req_tick;
  37.                
  38.                 sys_st.api_tick.mutex_req_tick = bsp_cpu_clks_get();
  39.                 tx_mutex_put(&os_obj.mutex_common);
  40.                 sys_st.api_tick.mutex_put_tick_amount = bsp_cpu_clks_get() - sys_st.api_tick.mutex_req_tick;
  41.                 */
  42.                
  43.                 // 互斥量等待获取
  44.                 if(sys_st.api_tick.b_mutex_busy)
  45.                 {
  46.                         sys_st.api_tick.mutex_req = 1;
  47.                         tx_mutex_get(&os_obj.mutex_common, TX_WAIT_FOREVER);
  48.                         
  49.                         sys_st.api_tick.mutex_get_tick = bsp_cpu_clks_get();
  50.                         sys_st.api_tick.mutex_get_tick_amount =
  51.                                 sys_st.api_tick.mutex_get_tick - sys_st.api_tick.mutex_put_tick;
  52.                         
  53.                         tx_mutex_put(&os_obj.mutex_common);
  54.                 }
  55.         }
复制代码


低优先级任务发送
  1. void os_sync_send(void)
  2. {
  3.         if(sys_st.api_tick.sem_req)
  4.         {
  5.                 sys_st.api_tick.sem_send_tick = bsp_cpu_clks_get();
  6.                 tx_semaphore_put(&os_obj.sem_tst);
  7.         }
  8.         
  9.         if(sys_st.api_tick.event_req)
  10.         {
  11.                 sys_st.api_tick.event_send_tick = bsp_cpu_clks_get();
  12.                 tx_event_flags_set(&os_obj.event_tst, 1, TX_OR);
  13.         }
  14.         
  15.         if(sys_st.api_tick.quene_req)
  16.         {
  17.                 sys_st.api_tick.quene_send_tick = bsp_cpu_clks_get();
  18.                  tx_queue_send(&os_obj.quene_tst, sys_st.api_tick.quene_dat, TX_NO_WAIT);
  19.         }
  20.         
  21.         if(!sys_st.api_tick.b_mutex_busy)
  22.         {
  23.                 tx_mutex_get(&os_obj.mutex_common, TX_WAIT_FOREVER);
  24.                 sys_st.api_tick.b_mutex_busy = 1;
  25.         }
  26.         
  27.         if(sys_st.api_tick.mutex_req)
  28.         {
  29.                 sys_st.api_tick.mutex_put_tick = bsp_cpu_clks_get();
  30.                 tx_mutex_put(&os_obj.mutex_common);
  31.         }
  32.         
  33. }
复制代码
测试结果如下:
os_thread.png
我原以为信号方式是最快的,结果它最慢,队列反而是最快的。互斥量的测试方法是,让低优先级任务先获取信号量,然后高优先级任务请求,测得时间是 低优先级任务释放到高优先级获取成功的时间。
另外,当互斥信号量空闲时,获取仅71时钟,释放68时钟。

=====================================================================================
ISR发送测试

  1. void isr_sync_send(void)
  2. {
  3.         if(sys_st.api_tick.sem_req)
  4.         {
  5.                 sys_st.api_tick.sem_send_tick = bsp_cpu_clks_get();
  6.                 tx_semaphore_put(&os_obj.sem_tst);
  7.         }
  8.         
  9.         if(sys_st.api_tick.event_req)
  10.         {
  11.                 sys_st.api_tick.event_send_tick = bsp_cpu_clks_get();
  12.                 tx_event_flags_set(&os_obj.event_tst, 1, TX_OR);
  13.         }
  14.         
  15.         if(sys_st.api_tick.quene_req)
  16.         {
  17.                 sys_st.api_tick.quene_send_tick = bsp_cpu_clks_get();
  18.                  tx_queue_send(&os_obj.quene_tst, sys_st.api_tick.quene_dat, TX_NO_WAIT);
  19.         }
  20. }
复制代码


os_isr.png
ISR中发送同步,信号量表现好多了,队列依然是最快的。
互斥量在ISR不可用,不测试

由于threadx不同的宏定义对执行效率有重大影响,本测试仅代表API的相对速度。测试得到的时钟数数据是反复观测的,结果应该是准确的。
测试用tx_user.h配置
tx_user.h (11.78 KB, 下载次数: 0)



回复

使用道具 举报

3

主题

49

回帖

58

积分

初级会员

积分
58
发表于 2021-6-9 14:19:07 | 显示全部楼层
这里有建议?!不知道对不对?!
2021-06-09 141720.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-20 22:30 , Processed in 0.699987 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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