[资料工具] NV32 BOS位操作指令时间测试

[复制链接]
837|5
 楼主| 萧洛毫 发表于 2018-2-27 09:22 | 显示全部楼层 |阅读模式
BOS位操作指令时间测试.zip (392.06 KB, 下载次数: 6)
 楼主| 萧洛毫 发表于 2018-2-27 09:23 | 显示全部楼层
  1. #include "common.h"
  2. #include "ics.h"
  3. #include "rtc.h"
  4. #include "uart.h"
  5. #include "systick.h"
  6. #include "bme.h"
  7. #include "sysinit.h"
  8. #include "start.h"

  9. #define GPIO_ALIAS_OFFSET       0x000F0000L                                         
  10. #define GPIOB_PDOR_ALIAS        (((uint32_t)&GPIOB->PDOR)-GPIO_ALIAS_OFFSET)         

  11. int main (void);
  12. void RTC_Task(void);
  13. uint32_t BME_LogicANDPwithC(void);
  14. uint32_t BME_LogicANDPwithBME(void);
  15. uint32_t BME_LogicORPwithC(void);
  16. uint32_t BME_LogicORPwithBME(void);
  17. uint32_t BME_LogicOXRPwithC(void);
  18. uint32_t BME_LogicOXRPwithBME(void);
  19. uint32_t BME_LogicSETPwithC(void);
  20. uint32_t BME_LogicSETPwithBME(void);
  21. uint32_t BME_LogicCLEARPwithC(void);
  22. uint32_t BME_LogicCLEARPwithBME(void);
  23. uint32_t BME_BFIwithC(uint32_t *pAddr, uint8_t u8BitPos, uint8_t u8FieldWidth, uint32_t u32Data);
  24. uint32_t BME_BFIwithBME(void);

  25. int main (void)
  26. {
  27.     sysinit();


  28.     printf("\r\nRunning the BME_Timetest_demo project.\r\n");
  29.        
  30.     printf("Logic AND operation.\r\n");
  31.     printf("Logic operation in C takes %d ticks!\r\n", BME_LogicANDPwithC());
  32.     printf("Logic operation with BME takes %d ticks!\r\n", BME_LogicANDPwithBME());
  33.        
  34.           printf("Logic OR operation.\r\n");
  35.     printf("Logic operation in C takes %d ticks!\r\n", BME_LogicORPwithC());
  36.     printf("Logic operation with BME takes %d ticks!\r\n", BME_LogicORPwithBME());
  37.        
  38.           printf("Logic OXR operation.\r\n");
  39.           printf("Logic operation in C takes %d ticks!\r\n", BME_LogicOXRPwithC());
  40.     printf("Logic operation with BME takes %d ticks!\r\n", BME_LogicOXRPwithBME());
  41.        
  42.           printf("Logic BIT-SET operation.\r\n");
  43.           printf("Logic operation in C takes %d ticks!\r\n", BME_LogicSETPwithC());
  44.     printf("Logic operation with BME takes %d ticks!\r\n", BME_LogicSETPwithBME());
  45.        
  46.                 printf("Logic BIT-CLEAR operation.\r\n");
  47.           printf("Logic operation in C takes %d ticks!\r\n", BME_LogicCLEARPwithC());
  48.     printf("Logic operation with BME takes %d ticks!\r\n", BME_LogicCLEARPwithBME());

  49.     GPIOB->PDDR |= (0xF << 16);   
  50.     GPIOB->PIDR &= ~(0xF << 16);            

  51.     printf("Bit field operation in C takes %d ticks!\r\n", BME_BFIwithC((uint32_t*)&GPIOB->PDOR,16,4-1, 5<<16));  /*!< bit width -1 as 3rd parameter */
  52.     printf("Bit field operation with BME takes %d ticks!\r\n", BME_BFIwithBME());  
  53.     printf("Test completed!\n");
  54.     while(1)
  55.     {
  56.     }
  57. }
  58. /******************C***AND**********************************/
  59. uint32_t BME_LogicANDPwithC(void)
  60. {   
  61.         uint32_t i=0;
  62.     uint32_t    u32LogicOPTicks;   
  63.   
  64.     GPIOA->PDDR |= 0xff;
  65.     GPIOA->PIDR &= ~0xff;

  66.     SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
  67.     SysTick->VAL = 0x0;
  68.     SysTick->LOAD = 0x00FFFFFF;
  69.     SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
  70.        
  71.     GPIOA->PDOR &= 0x02;           //AND
  72.     u32LogicOPTicks = SysTick->VAL;
  73.     return (SysTick->LOAD - u32LogicOPTicks);
  74. }
  75. /******************BME*********AND********************************/
  76. uint32_t BME_LogicANDPwithBME(void)
  77. {
  78.     uint32_t    u32LogicOPTicks;
  79.    
  80.     GPIOA->PDDR |= 0xff;
  81.     GPIOA->PIDR &= ~0xff;        
  82.     SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
  83.     SysTick->VAL = 0x0;
  84.     SysTick->LOAD = 0x00FFFFFF;
  85.     SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);


  86.           BME_AND(&GPIOA->PDOR) = 0x02;   //寄存器中的数据与0x02执行AND

  87.     u32LogicOPTicks = SysTick->VAL;
  88.     return (SysTick->LOAD - u32LogicOPTicks);
  89. }
  90. /*******************C************OR*************************************/
  91. uint32_t BME_LogicORPwithC(void)
  92. {
  93.    
  94.     uint32_t    u32LogicOPTicks;   
  95.   
  96.     GPIOA->PDDR |= 0xff;
  97.     GPIOA->PIDR &= ~0xff;

  98.     SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
  99.     SysTick->VAL = 0x0;
  100.     SysTick->LOAD = 0x00FFFFFF;
  101.     SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);

  102.     GPIOA->PDOR |= 0x02;           //OR
  103.    
  104.     u32LogicOPTicks = SysTick->VAL;
  105.     return (SysTick->LOAD - u32LogicOPTicks);
  106. }
  107. /*******************BME************OR*************************************/
  108. uint32_t BME_LogicORPwithBME(void)

  109. {

  110.     uint32_t    u32LogicOPTicks;
  111.    
  112.     GPIOA->PDDR |= 0xff;
  113.     GPIOA->PIDR &= ~0xff;        
  114.     SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
  115.     SysTick->VAL = 0x0;
  116.     SysTick->LOAD = 0x00FFFFFF;
  117.     SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);


  118.           BME_OR(&GPIOA->PDOR) = 0x02;   //寄存器中的数据与0x02执行OR

  119.     u32LogicOPTicks = SysTick->VAL;
  120.     return (SysTick->LOAD - u32LogicOPTicks);
  121. }
  122. /*******************C************XOR*************************************/
  123. uint32_t BME_LogicOXRPwithC(void)
  124. {
  125.   
  126.     uint32_t    u32LogicOPTicks;   
  127.   
  128.     GPIOA->PDDR |= 0xff;
  129.     GPIOA->PIDR &= ~0xff;

  130.     SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
  131.     SysTick->VAL = 0x0;
  132.     SysTick->LOAD = 0x00FFFFFF;
  133.     SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);

  134.     GPIOA->PDOR ^= 0x02;           //XOR
  135.     u32LogicOPTicks = SysTick->VAL;
  136.     return (SysTick->LOAD - u32LogicOPTicks);
  137. }
  138. /*******************BME************XOR*************************************/
  139. uint32_t BME_LogicOXRPwithBME(void)

  140. {
  141.          
  142.     uint32_t    u32LogicOPTicks;
  143.    
  144.     GPIOA->PDDR |= 0xff;
  145.     GPIOA->PIDR &= ~0xff;        
  146.     SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
  147.     SysTick->VAL = 0x0;
  148.     SysTick->LOAD = 0x00FFFFFF;
  149.     SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);


  150.           BME_XOR(&GPIOA->PDOR) = 0x02;   //寄存器中的数据与0x02执行异或

  151.     u32LogicOPTicks = SysTick->VAL;
  152.     return (SysTick->LOAD - u32LogicOPTicks);
  153. }
  154. /*******************C************BIT-SET*************************************/
  155. uint32_t BME_LogicSETPwithC(void)
  156. {
  157.    
  158.     uint32_t    u32LogicOPTicks;   
  159.   
  160.     GPIOA->PDDR |= 0xff;
  161.     GPIOA->PIDR &= ~0xff;

  162.     SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
  163.     SysTick->VAL = 0x0;
  164.     SysTick->LOAD = 0x00FFFFFF;
  165.     SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);

  166.     GPIOA->PDOR |= 0x02;           //SET
  167.     u32LogicOPTicks = SysTick->VAL;
  168.     return (SysTick->LOAD - u32LogicOPTicks);
  169. }
  170. /*******************BME************BIT-SET*************************************/
  171. uint32_t BME_LogicSETPwithBME(void)

  172. {
  173.          
  174.     uint32_t    u32LogicOPTicks;
  175.    
  176.     GPIOA->PDDR |= 0xff;
  177.     GPIOA->PIDR &= ~0xff;        
  178.     SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
  179.     SysTick->VAL = 0x0;
  180.     SysTick->LOAD = 0x00FFFFFF;
  181.     SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);


  182.           BME_BIT_SET(&GPIOA->PDOR,0);    //寄存器对应位置1
  183.        
  184.     u32LogicOPTicks = SysTick->VAL;
  185.     return (SysTick->LOAD - u32LogicOPTicks);
  186. }
  187. /*******************C************BIT-CLEAR*************************************/
  188. uint32_t BME_LogicCLEARPwithC(void)
  189. {
  190.    
  191.     uint32_t    u32LogicOPTicks;   
  192.   
  193.     GPIOA->PDDR |= 0xff;
  194.     GPIOA->PIDR &= ~0xff;

  195.     SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
  196.     SysTick->VAL = 0x0;
  197.     SysTick->LOAD = 0x00FFFFFF;
  198.     SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);

  199.                      //PDOR第一位清零
  200.     GPIOA->PDOR &= ~0x01;           
  201.   
  202.                   
  203.     u32LogicOPTicks = SysTick->VAL;
  204.     return (SysTick->LOAD - u32LogicOPTicks);
  205. }
  206. /*******************BME************BIT-CLEAR*************************************/
  207. uint32_t BME_LogicCLEARPwithBME(void)

  208. {
  209.     uint32_t    u32LogicOPTicks;
  210.    
  211.     GPIOA->PDDR |= 0xff;
  212.     GPIOA->PIDR &= ~0xff;        
  213.     SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
  214.     SysTick->VAL = 0x0;
  215.     SysTick->LOAD = 0x00FFFFFF;
  216.     SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);

  217.           BME_BIT_CLEAR(&GPIOA->PDOR,0);  //寄存器对应位清零
  218.     u32LogicOPTicks = SysTick->VAL;
  219.     return (SysTick->LOAD - u32LogicOPTicks);
  220. }

  221. /***************************************************************************
  222. *在以 u8BitPos为起始位,宽度为u8FieldWidth+1,的区域内插入输入数据u32Data
  223. ******************************************************************************/
  224. uint32_t BME_BFIwithC(uint32_t *pAddr, uint8_t u8BitPos, uint8_t u8FieldWidth, uint32_t u32Data)
  225. {
  226.     uint32_t    u32RegVal;
  227.     uint32_t    u32Mask;  
  228.     uint32_t    u32LogicOPTicks;


  229.     SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
  230.     SysTick->VAL = 0x0;       
  231.     SysTick->LOAD = 0x00FFFFFF;
  232.     SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
  233.    
  234.     u32RegVal = *pAddr;   
  235.     u32Mask = ((1 << (u8FieldWidth+1)) - 1) << u8BitPos;
  236.     u32RegVal = (u32RegVal & ~u32Mask)|((u32Data) & u32Mask);
  237.     *pAddr = u32RegVal;  
  238.     u32LogicOPTicks = SysTick->VAL;
  239.     return (SysTick->LOAD - u32LogicOPTicks);
  240. }

  241. /************************************************************************
  242. *   write 5 to bit 19..16
  243. **************************************************************************/

  244. uint32_t BME_BFIwithBME(void)
  245. {
  246.       
  247.     uint32_t    u32LogicOPTicks;
  248.     uint32_t    u32Data = (0x5 << 16);
  249.     uint32_t    u32Addr = GPIOB_PDOR_ALIAS;
  250.    
  251.     GPIOB->PDDR |= (0xF << 16);  
  252.     GPIOB->PDOR =  0;            
  253.     GPIOB->PIDR &= ~(0xF << 16);
  254.    
  255.     SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
  256.     SysTick->VAL = 0x0;       
  257.     SysTick->LOAD = 0x00FFFFFF;
  258.     SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
  259.     BME_BITFIELD_INSERT(u32Addr,16,4) =  u32Data;  /* write 5 to bit 19..16 */
  260.       
  261.     u32LogicOPTicks = SysTick->VAL;
  262.     return (SysTick->LOAD - u32LogicOPTicks);  
  263. }

 楼主| 萧洛毫 发表于 2018-2-27 09:23 | 显示全部楼层
  1. /******************************************************************************
  2. *
  3. * [url=home.php?mod=space&uid=247401]@brief[/url] define interrupt service routines referenced by the vector table.
  4. *
  5. * Note: Only "vectors.c" should include this header file.
  6. *
  7. *******************************************************************************
  8. ******************************************************************************/

  9. #ifndef __ISR_H
  10. #define __ISR_H


  11. /* Example */
  12. /*
  13. #undef  VECTOR_036
  14. #define VECTOR_036 RTC_Isr

  15. // ISR(s) are defined in your project directory.
  16. extern void RTC_Isr(void);
  17. */

  18. /*!
  19. * @brief define interrupt service routine for different vectors.
  20. *
  21. */
  22. #undef  VECTOR_036
  23. #define VECTOR_036      RTC_Isr          /*!< Vector 36 points to RTC interrupt service routine */

  24. extern void RTC_Isr(void);

  25. #endif  //__ISR_H

  26. /* End of "isr.h" */
余三水 发表于 2018-2-27 23:29 | 显示全部楼层
没看懂,哪个是位操作指令呢?
tomyoct 发表于 2018-2-28 15:49 | 显示全部楼层
BOS位操作指令和另一个主贴之间的GPIO位带有什么操作的区别呢?
smilingangel 发表于 2018-3-18 15:50 | 显示全部楼层
这个代码的还是看下的,,不错的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

254

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部