根据正点原子FreeRTOS视频整理

单片机:STM32F207VC

FreeRTOS源码版本:v10.0.1

  1. * 1. 要使用vTaskGetRunTimeStats()函数,需满足以下条件:
  2. * a configGENERATE_RUN_TIME_STATS必须为1
  3. * b 定义宏:portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() 配置一个高精度定时器提供时基
  4. * c 定义宏:portGET_RUN_TIME_COUNTER_VALUE() 读取时基的时间值

1. main.c

  1. /*
  2. * 1. 要使用vTaskGetRunTimeStats()函数,需满足以下条件:
  3. * a 宏configGENERATE_RUN_TIME_STATS必须为1
  4. * b 定义宏:portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() 配置一个高精度定时器提供时基
  5. * c 定义宏:portGET_RUN_TIME_COUNTER_VALUE() 读取时基的时间值
  6. */
  7. #include "main.h"
  8. #include "delay.h"
  9. #include "sys.h"
  10. #include "usart.h"
  11. #include <string.h> /*memset()*/
  12.  
  13. #include "stm32f2xx_gpio.h"
  14. #include "stm32f2xx_tim.h"
  15.  
  16. #include "FreeRTOS.h"
  17. #include "task.h"
  18.  
  19. #define START_TASK_PRIO 1 /*任务优先级*/
  20. #define START_STK_SIZE 128 /*任务堆栈大小*/
  21. TaskHandle_t StartTask_Handle; /*任务句柄*/
  22. void StartTask(void *pvParameters); /*任务函数*/
  23.  
  24. #define LED_TASK_PRIO 2
  25. #define LED_STK_SIZE 128
  26. TaskHandle_t LedTask_Handle;
  27. void LedTask(void *pvParameters);
  28.  
  29. #define RUNTIMESTATS_TASK_PRIO 3
  30. #define RUNTIMESTATS_STK_SIZE 128
  31. TaskHandle_t RunTimeStats_Handle;
  32. void RunTimeStatsTask(void *pvParameters);
  33.  
  34. char RunTimeInfo[]; /*保存任务运行时间信息*/
  35. uint8_t ControlCounter = ;
  36. volatile unsigned long long FreeRTOSRunTimeTicks;
  37.  
  38. /***** 声明 *****/
  39. static void SystemInitial(void);
  40. static void GPIO_LED_Configuration(void);
  41. static void Timer4_Configuration(void);
  42. static void Timer4_NVIC_Configuration(void);
  43.  
  44. static void GPIO_LED_Configuration(void)
  45. {
  46. GPIO_InitTypeDef GPIO_InitStructure;
  47.  
  48. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  49.  
  50. GPIO_InitStructure.GPIO_Pin = LED_POWER | LED_RUN | LED_ALARM;
  51. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  52. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  53. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  54. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  55. GPIO_Init(GPIOE, &GPIO_InitStructure);
  56.  
  57. LED_Power_On();
  58. GPIO_SetBits(GPIOE, LED_RUN);
  59. }
  60.  
  61. void StartTask(void *pvParameters)
  62. {
  63. taskENTER_CRITICAL(); /*进入临界区*/
  64.  
  65. xTaskCreate((TaskFunction_t )LedTask, /*任务函数*/
  66. (const char * )"LedTask", /*任务名称*/
  67. (uint16_t )LED_STK_SIZE, /*任务堆栈大小*/
  68. (void * )NULL, /*传递给任务函数的参数*/
  69. (UBaseType_t )LED_TASK_PRIO, /*任务优先级*/
  70. (TaskHandle_t )&LedTask_Handle); /*任务句柄*/
  71.  
  72. xTaskCreate((TaskFunction_t )RunTimeStatsTask, /*任务函数*/
  73. (const char * )"RunTimeStatsTask", /*任务名称*/
  74. (uint16_t )RUNTIMESTATS_STK_SIZE, /*任务堆栈大小*/
  75. (void * )NULL, /*传递给任务函数的参数*/
  76. (UBaseType_t )RUNTIMESTATS_TASK_PRIO, /*任务优先级*/
  77. (TaskHandle_t )&RunTimeStats_Handle); /*任务句柄*/
  78.  
  79. vTaskDelete(StartTask_Handle); /*删除开始任务*/
  80. taskEXIT_CRITICAL(); /*退出临界区*/
  81. }
  82.  
  83. void LedTask(void *pvParameters)
  84. {
  85. while ()
  86. {
  87. GPIOE->ODR ^= LED_RUN;
  88. vTaskDelay();
  89. }
  90. }
  91.  
  92. void RunTimeStatsTask(void * pvParameters)
  93. {
  94. while ()
  95. {
  96. if ( == ControlCounter)
  97. {
  98. ControlCounter = ;
  99. memset(RunTimeInfo, , ); /*信息缓冲区清零*/
  100. vTaskGetRunTimeStats(RunTimeInfo); /*获取任务运行时间信息*/
  101. printf("任务名\t\t运行时间\t运行所占百分比\r\n");
  102. printf("%s\r\n", RunTimeInfo);
  103. }
  104. vTaskDelay();
  105. }
  106. }
  107.  
  108. static void SystemInitial(void)
  109. {
  110. /*组4,16级抢占优先级,无响应优先级*/
  111. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  112.  
  113. DelayInitial();
  114. USART1_Initialization();
  115. GPIO_LED_Configuration();
  116. ConfigureTimeForRunTimeStats();
  117. }
  118.  
  119. int main(void)
  120. {
  121. SystemInitial();
  122.  
  123. /*创建开始任务*/
  124. xTaskCreate((TaskFunction_t )StartTask, /*任务函数*/
  125. (const char * )"StartTask", /*任务名称*/
  126. (uint16_t )START_STK_SIZE, /*任务堆栈大小*/
  127. (void * )NULL, /*传递给任务函数的参数*/
  128. (UBaseType_t )START_TASK_PRIO, /*任务优先级*/
  129. (TaskHandle_t * )&StartTask_Handle); /*任务句柄*/
  130.  
  131. /*开启任务调度*/
  132. vTaskStartScheduler();
  133. }
  134.  
  135. ///////////////////定时器4//////////////////////////////////////
  136. /***** Timer4 *****/
  137. void ConfigureTimeForRunTimeStats(void)
  138. {
  139. FreeRTOSRunTimeTicks = ;
  140. Timer4_Configuration();
  141. Timer4_NVIC_Configuration();
  142. }
  143.  
  144. /*timer4:APB1 30MHz*/
  145. static void Timer4_Configuration(void)
  146. {
  147. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  148.  
  149. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  150.  
  151. /*预分频系数*/
  152. TIM_TimeBaseStructure.TIM_Prescaler = -;
  153. /*计数值,每计50个数,产生一次中断. 50*(1/1MHk) = 50us */
  154. TIM_TimeBaseStructure.TIM_Period = -;
  155. /*设置计数器模式为向上计数模式*/
  156. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  157. /*设置时钟分频系数,TIM_CKD_DIV1不分频*/
  158. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  159.  
  160. TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
  161.  
  162. /*使能TIM4外设。在使用外设时,不仅要使能其时钟,还要调用此函数使能外设才可以正常使用*/
  163. TIM_Cmd(TIM4, ENABLE);
  164.  
  165. /*清除溢出中断标志*/
  166. TIM_ClearFlag(TIM4, TIM_IT_Update);
  167.  
  168. /*开启中断*/
  169. TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
  170. }
  171.  
  172. /**/
  173. static void Timer4_NVIC_Configuration(void)
  174. {
  175. NVIC_InitTypeDef NVIC_InitStructure;
  176.  
  177. /*3级抢占优先级,0级响应优先级*/
  178. NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
  179. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
  180. NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
  181. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  182.  
  183. NVIC_Init(&NVIC_InitStructure);
  184. }
  185.  
  186. /*中断服务函数*/
  187. uint16_t Timer4Counter = ;
  188. void TIM4_IRQHandler(void)
  189. {
  190. if (TIM_GetITStatus(TIM4, TIM_IT_Update)==SET)
  191. {
  192. FreeRTOSRunTimeTicks++;
  193.  
  194. Timer4Counter++;
  195. if (Timer4Counter>=)
  196. {
  197. Timer4Counter = ;
  198. GPIOE->ODR ^= LED_ALARM;
  199.  
  200. ControlCounter++;
  201. }
  202. }
  203. TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
  204. }
  205.  
  206. /***************************END OF FILE***************************/

2. main.h

  1. /**/
  2. #ifndef __MAIN_H__
  3. #define __MAIN_H__
  4.  
  5. #define LED_POWER GPIO_Pin_2 /*PE2*/
  6. #define LED_RUN GPIO_Pin_3 /*PE3*/
  7. #define LED_ALARM GPIO_Pin_4 /*PE4*/
  8.  
  9. #define LED_Power_On() GPIO_ResetBits(GPIOE, LED_POWER)
  10.  
  11. extern void ConfigureTimeForRunTimeStats(void);
  12.  
  13. #endif /*__MAIN_H__*/
  14.  
  15. /***************************END OF FILE***************************/

3. sys.c

  1. /**/
  2. #include "sys.h"
  3. #include "stdio.h"
  4.  
  5. #pragma import(__use_no_semihosting)
  6. //标准库需要的支持函数
  7. struct __FILE
  8. {
  9. int handle;
  10.  
  11. };
  12.  
  13. FILE __stdout;
  14. //定义_sys_exit()以避免使用半主机模式
  15. void _sys_exit(int x)
  16. {
  17. x = x;
  18. }
  19. /* //重定义fputc函数
  20. int fputc(int ch, FILE *f)
  21. {
  22. while((USART1->SR&0X40)==0) //循环发送,直到发送完毕
  23. USART1->DR = (u8) ch;
  24. return ch;
  25. } */
  26.  
  27. /***************************END OF FILE***************************/

4. sys.h

  1. /**/
  2. #ifndef __SYS_H__
  3. #define __SYS_H__
  4.  
  5. /*0不支持OS,1支持OS*/
  6. #define SYSTEM_SUPPORT_OS 1 /*定义系统文件夹是否支持OS*/
  7.  
  8. #endif /*__SYS_H__*/
  9.  
  10. /***************************END OF FILE***************************/

5. delay.c

  1. /**/
  2. #include "delay.h"
  3. #include "sys.h"
  4. /*如果需要使用OS,则包括下面的头文件即可*/
  5. #if SYSTEM_SUPPORT_OS
  6. #include "FreeRTOS.h"
  7. #include "task.h"
  8. #endif
  9.  
  10. __IO uint32_t TimingDelay;
  11.  
  12. //////////////////////////
  13. //static uint8_t fac_us = 0;
  14. //////////////////////////
  15.  
  16. /***** 声明 *****/
  17. extern void xPortSysTickHandler(void);
  18.  
  19. /*systick中断服务函数,使用FreeRTOS时用到*/
  20. void SysTick_Handler(void)
  21. {
  22. TimingDelayDecrement();
  23.  
  24. if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED) /*系统已运行*/
  25. {
  26. xPortSysTickHandler();
  27. }
  28. }
  29.  
  30. void DelayInitial(void)
  31. {
  32. /*
  33. * SystemCoreClock / 1000 1ms中断一次
  34. * SystemCoreClock / 100000 10us中断一次
  35. * SystemCoreClock / 1000000 1us中断一次
  36. */
  37. if (SysTick_Config(SystemCoreClock / ))
  38. {
  39. while ();
  40. }
  41. /*关闭systick timer定时器*/
  42. /* SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;*/
  43.  
  44. /*使能滴答定时器*/
  45. SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
  46. }
  47.  
  48. //void DelayNus(uint32_t nus)
  49. //{
  50. // uint32_t ticks;
  51. // uint32_t told, tnow, tcnt = 0;
  52. // uint32_t reload = SysTick->LOAD;
  53. //
  54. // fac_us = SystemCoreClock / 1000000;
  55. // ticks = nus * fac_us;
  56. // told = SysTick->VAL;
  57. //
  58. // while (1)
  59. // {
  60. // tnow = SysTick->VAL;
  61. // if (tnow != told)
  62. // {
  63. // if (tnow < told)
  64. // {
  65. // tcnt += told - tnow;
  66. // }
  67. // else
  68. // {
  69. // tcnt += reload - tnow + told;
  70. // }
  71. // told = tnow;
  72. // if (tcnt >= ticks) break;
  73. // }
  74. // }
  75. //}
  76.  
  77. ///*不会引起调度*/
  78. //void DelayXms(uint32_t nms)
  79. //{
  80. // uint32_t i;
  81. //
  82. // for (i=0;i<nms;++i)
  83. // {
  84. // DelayNus(1000);
  85. // }
  86. //}
  87.  
  88. /*
  89. * 本函数在中断函数中调用,滴答定时器中断一次调用一次。
  90. */
  91. void TimingDelayDecrement(void)
  92. {
  93. if (TimingDelay != 0x00)
  94. {
  95. TimingDelay--;
  96. }
  97. }
  98.  
  99. /*
  100. * TimingDelay值在TimingDelayDecrement函数中递减
  101. */
  102. void DelayNms(uint32_t nTimes)
  103. {
  104. TimingDelay = nTimes;
  105.  
  106. while (TimingDelay!=); //等待计数停止
  107. }
  108.  
  109. /***************************END OF FILE***************************/

6. delay.h

  1. /**/
  2. #ifndef __DELAY_H__
  3. #define __DELAY_H__
  4.  
  5. #include "stm32f2xx.h"
  6.  
  7. #include <stdint.h>
  8.  
  9. extern void DelayInitial(void);
  10. extern void TimingDelayDecrement(void);
  11. extern void DelayNms(uint32_t nTimes);
  12.  
  13. /////////////////////////
  14. extern void DelayXms(uint32_t nms);
  15. /////////////////////////
  16.  
  17. #endif /*__DELAY_H__*/
  18. /***************************END OF FILE***************************/

7. usart.c

  1. /*
  2. * USART1: 中断优先级选择第4组, 3级抢占优先级 无响应优先级
  3. */
  4. #include "usart.h"
  5. #include "stdio.h" /*printf*/
  6. #include "stm32f2xx.h"
  7. #include "stm32f2xx_gpio.h"
  8. #include "stm32f2xx_rcc.h"
  9. #include "stm32f2xx_usart.h"
  10.  
  11. uint8_t USART1_RxBuffer[USART1_RECEIVE_SIZE];
  12. uint8_t Flag_USART1Receive = ;
  13. uint8_t USART1_ReceiveCount = ;
  14. uint8_t USART1_ReceiveIndex = ;
  15.  
  16. void USART1_Initialization(void)
  17. {
  18. USART1_GPIO_Configuration();
  19. USART1_NVIC_Configuration();
  20. /*USART1使能接收中断*/
  21. // USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  22. /*USART1使能发送中断*/
  23. /* USART_ITConfig(USART1, USART_IT_TXE, ENABLE); */
  24. }
  25. /*
  26. */
  27. void USART1_GPIO_Configuration(void)
  28. {
  29. GPIO_InitTypeDef GPIO_InitStructure;
  30. USART_InitTypeDef USART_InitStructure;
  31.  
  32. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  33. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  34. GPIO_PinAFConfig(GPIOA, , GPIO_AF_USART1); /*GPIO连接到串口1上,PA9-TXD*/
  35. GPIO_PinAFConfig(GPIOA, , GPIO_AF_USART1); /*GPIO连接到串口1上,PA10-RXD*/
  36.  
  37. /*tx, PA9*/
  38. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  39. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  40. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  41. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  42. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  43. GPIO_Init(GPIOA, &GPIO_InitStructure);
  44.  
  45. /*rx, PA10*/
  46. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  47. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  48. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  49. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  50. GPIO_Init(GPIOA, &GPIO_InitStructure);
  51.  
  52. /*配置波特率9600*/
  53. USART_InitStructure.USART_BaudRate = ;
  54. /*配置串口的模式。为了配置双线全双工通讯,需要把Rx和Tx模式都开启. Tx发送使能和Rx接收使能*/
  55. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  56. /*无奇偶校验*/
  57. USART_InitStructure.USART_Parity = USART_Parity_No;
  58. /*1停止位*/
  59. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  60. /*配置串口传输字长8位*/
  61. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  62. /*不采用硬件流控制*/
  63. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  64. /*向寄存器写入配置参数*/
  65. USART_Init(USART1, &USART_InitStructure);
  66. /*使能USART1外设。在使用外设时,不仅要使能其时钟,还要调用此函数使能外设才可以正常使用*/
  67. USART_Cmd(USART1, ENABLE);
  68. }
  69.  
  70. //void USART1_SendNChar(uint8_t *str, uint8_t n)
  71. //{
  72. // /*发送区是否为空*/
  73. // while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  74. //
  75. // while (n--)
  76. // {
  77. // USART_SendData(USART1, (uint8_t)(*str++));
  78. // /*是否发送完成*/
  79. // while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  80. // }
  81. //}
  82.  
  83. /*
  84. * 如果一次发送多个字节数据,可能会多次进入此函数
  85. * 调用时,应先延时几十毫秒,确保把数据都接收完
  86. */
  87. //void USART1_ReceiveIRQ(void)
  88. //{
  89. // /*如果寄存器中有数据*/
  90. // while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)
  91. // {
  92. // USART1_RxBuffer[USART1_ReceiveIndex++] = USART_ReceiveData(USART1);
  93. // USART1_ReceiveCount++;
  94. // }
  95. //
  96. // Flag_USART1Receive = 1;
  97. //}
  98.  
  99. void USART1_NVIC_Configuration(void)
  100. {
  101. NVIC_InitTypeDef NVIC_InitStructure;
  102.  
  103. /*中断优先级选择第1组*/
  104. // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  105.  
  106. /*3级抢占优先级 0级响应优先级*/
  107. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  108. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
  109. NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
  110. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  111. NVIC_Init(&NVIC_InitStructure);
  112. }
  113.  
  114. /*重定义fputc函数 2种方法都可以*/
  115. /*
  116. int fputc(int ch,FILE *f)
  117. {
  118. while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
  119. USART_SendData(USART1,(uint8_t)ch);
  120. while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
  121.  
  122. return (ch);
  123. }
  124. */
  125.  
  126. int fputc(int ch, FILE *f)
  127. {
  128. while((USART1->SR&0X40)==) /*循环发送,直到发送完毕*/
  129. {}
  130.  
  131. USART1->DR = (uint8_t)ch;
  132. return ch;
  133. }
  134. /***************************END OF FILE***************************/

8. usart.h

  1. /*
  2. *
  3. */
  4. #ifndef __USART_H__
  5. #define __USART_H__
  6.  
  7. #include <stdint.h> /* uint8_t */
  8.  
  9. #define USART1_RECEIVE_SIZE 20
  10.  
  11. void USART1_Initialization(void);
  12. void USART1_GPIO_Configuration(void);
  13. void USART1_SendNChar(uint8_t *str, uint8_t n);
  14. void USART1_ReceiveIRQ(void);
  15. void USART1_NVIC_Configuration(void);
  16.  
  17. #endif /*__USART_H__*/
  18.  
  19. /***************************END OF FILE***************************/

打印结果:

  1. 问题:
  2. 1. 在串口助手中,只显示:任务名、运行时间、运行所占百分比这一行,不显示LedTask等信息。
  3. 解决:中断服务函数中,忘记这一行:FreeRTOSRunTimeTicks++;

  

FreeRTOS-06任务运行时间信息统计的更多相关文章

  1. FreeRTOS任务运行时间信息统计

    相关宏的设置 configGENERATE_RUN_TIME_STATS //使能 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() //配置一个高精度定时器/计数器提 ...

  2. 12C CLONE PDB and config service_listener

    Clone PDB PtestDEV to Ptestuat in testuat 1)       Clone PtestDEV to Ptestuat C:\Windows\system32> ...

  3. Oracle——listener数据库监听 lsnrctl

    lsnrctl(Listener Control)是一个SQL*Net工具,用于控制数据库listener,这个工具提供了命令用于控制listener的启动.停止,查看listener的状态,改变li ...

  4. 【FreeRTOS学习06】深度解剖中断与任务之间同步的具体使用场景

    嵌入式系统中中断是必不可少的一部分: [FreeRTOS实战汇总]小白博主的RTOS学习实战快速进阶之路(持续更新) 文章目录 1 前言 2 中断特点 3 延迟中断处理 3.1 信号量的使用 3.2 ...

  5. 在Amazon FreeRTOS V10中使用运行时统计信息

    在MCU on Eclipse网站上看到Erich Styger在8月2日发的博文,一篇关于在Amazon FreeRTOS V10中使用运行时统计信息的文章,本人觉得很有启发,特将其翻译过来以备参考 ...

  6. C#中提供的精准测试程序运行时间的类Stopwatch

    C#中提供的精准测试程序运行时间的类Stopwatch http://www.cnblogs.com/ret00100/archive/2010/08/06/1793680.html 在需要对程序的执 ...

  7. FreeRTOS随记

    任务函数原型: void ATaskFunction(void * pvParameters); 任务不允许从实现函数中返回.如果一个任务不再需要,可以用vTaskDelete()删除; 一个任务函数 ...

  8. C# 精准获取代码运行时间

    纯粹转载,转载请注明参考链接及作者! 参考链接:http://www.cnblogs.com/ret00100/archive/2010/08/06/1793680.html,作者:博客园 大佬辉   ...

  9. FreeRTOS——任务管理

    1. FreeRTOS 任务不允许以任何方式从实现函数中返回——他们绝不能有一条“return”语句,也不可能执行到函数的末尾.如果一个函数不需要,可以将其删除,如在任务中使用函数vTaskDelet ...

随机推荐

  1. tomcat端口作用

    <Server port="8005" shutdown="SHUTDOWN">   <Connector port="8080&q ...

  2. Django学习笔记:为Model添加Action

    |- Django版本:1.8 |- Python版本:3.4 models.py 1 class Story(models.Model): #编辑Story状态 STATUS_CHOICES = ( ...

  3. Tag recommendaion... 论文中的小例子,使用HOSVD算法推荐

    本文内容来自于论文:Tag recommendations based on tensor dimensioanlity reduction 在社会标签系统中,存在三元关系,用户-物品-标签.这些数据 ...

  4. [GO]用go语言实现区块链工作原理

    基本原理这里就不写了,只写一个简单demo的实现 首先得有一个区块用来存储区块头和区块体 type Block struct { Version int64 PreBlockHash []byte H ...

  5. Spring框架总结(三)

    SpringIOC容器 一.创建对象 SpringIOC容器,是spring核心内容. 作用: 创建对象 & 处理对象的依赖关系 IOC容器创建对象: 创建对象, 有几种方式: 1) 调用无参 ...

  6. SQl语句收藏

    /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */ mysq ...

  7. 编写高质量代码改善C#程序的157个建议——建议127:用形容词组给接口命名

    建议127:用形容词组给接口命名 接口规范的是“Can do”,也就是说,它规范的是类型可以具有哪些行为.所以,接口的命名应该是一个形容词,如: IDisposable表示可以被释放 IEnumera ...

  8. Getting Started with Node.js on Heroku

    NodeJS应用托管平台 https://devcenter.heroku.com/articles/getting-started-with-nodejs#dyno-sleeping-and-sca ...

  9. Windows pip

    pip 最常用命令(go语言用go get) 显示版本和路径 pip --version 获取帮助 pip --help 升级 pip pip install -U pip 如果这个升级命令出现问题 ...

  10. jeecms栏目模型和内容模型的使用以及对应前台的标签中的属性名

    第一步:模型管理-添加模型: 栏目模板前缀设定方案下的channel目录下的ch_menu.html作为浏览栏目的模板页.对应访问网址:项目名/栏目名(一级或者二级栏目如news或者gnxw)/ind ...