完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
如果想查看FreeRTOS任务的运行状态,可以使用下面的两个函数:
1. vTaskList vTaskList((char *)&pcWriteBuffer); 使用该函数前要在文件FreeRTOSConfig.h中,设置宏: #define configUSE_TRACE_FACILITY 1 #define configUSE_STATS_FORMATTING_FUNCTIONS 1 2. vTaskGetRunTimeStats vTaskGetRunTimeStats((char *)&pcWriteBuffer); 使用该函数前要在文件FreeRTOSConfig.h中,设置宏define configGENERATE_RUN_TIME_STATS为1。 #define configGENERATE_RUN_TIME_STATS 1 configGENERATE_RUN_TIME_STATS的打开,需要值。在FreeRTOSConfig.h中配置两个应用程序功能配置的宏: #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() AppConfigureTimerForRuntimeStats() #define portGET_RUN_TIME_COUNTER_VALUE() AppGetRuntimeCounterValue() 第一个是在RTOS启动时配置Timer,第二个是返回实际的调用值。一般的法则是,用于测量任务的时间应该比实际的滴响应快10倍。 3. STM32F107示例代码 3.1配置定时器TIM6,每100us的中断一次(速度是系统定时器的10倍),定时中断累加runtimeCounter。 / * ----------------------- -------------------------------------------------- ----------*/ void MX_TIM6_Init(void) { TIM_MasterConfigTypeDef sMasterConfig; htim6.Instance = TIM6; htim6.Init.Prescaler = 72-1; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; htim6.Init.Period = 100-1; htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim6) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /* 在中断模式下启动 TIM 时基生成 */ HAL_TIM_Base_Start_IT(&htim6); } /*---------------------------------------------- ------------------------------------*/ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { /* 用户代码开始回调 1 */ if(htim-》Instance == TIM6) { runtimeCounter++; } /* USER CODE END Callback 1 */ } 3.2 在FreeRTOSConfig.h文件中配置如下宏定义: extern uint32_t runtimeCounter; #define configUSE_TRACE_FACILITY 1 #define configUSE_STATS_FORMATTING_FUNCTIONS 1 #define configGENERATE_RUN_TIME_STATS 1 #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (runtimeCounter = 0) #define configUSE_RUN_TIME_COUNTER_timeCounter, 在UDP 中执行portGET_RUN_TIME_COUNTER_timeCounter 任务 ----在任务中查看任务---- -------------------------------------------------- ----------------------------*/ static void udpecho_thread(void *arg) { void *data; u16_t len; 字符任务缓冲区[512]; err_t 错误,recv_err; LWIP_UNUSED_ARG(arg); conn = netconn_new(NETCONN_UDP); if (conn!= NULL) { err = netconn_bind(conn, IP_ADDR_ANY, 8000); if (err == ERR_OK) { while (1) { recv_err = netconn_recv(conn, &buf); if (recv_err == ERR_OK) { netbuf_data(buf, &data, &len); if (len 》= 4) { if(strncmp(data, “tasklist”, 8) == 0) { memset(tasks_buf, 0, 512); strcat((char *)tasks_buf, “任务名称t运行状态t优先级t火花t任务顺序rn” ); strcat((char *)tasks_buf, “---------------------------------------- ----rn”); /* 任务列表及其状态 */ vTaskList((char *)(tasks_buf + strlen(tasks_buf))); strcat((char *)tasks_buf, “rn--------------------------------- --------rn”); //strcat((char *)tasks_buf, “B : Blocked, R : Ready, D : Deleted, S : Suspendedrn”); strcat(( *)tasks_buf, “B : 蓝牙, R : char , D : 删除, S : 暂停rn”); // 初始化一个 netbuf 并引用 tasks_buf。 sendbuf = netbuf_new(); if(sendbuf != NULL) { netbuf_ref(sendbuf, tasks_buf, strlen(tasks_buf)); } } else if(strncmp(data, “taskstatus”, 10) == 0) { memset(tasks_buf, 0, 512); strcat((char *)tasks_buf, “任务名称t运行计数t使用率rn”); strcat((char *)tasks_buf, “---------------------------------------- ----rn”); /* 以绝对和百分比形式显示每个任务在运行状态* 中花费的时间。*/ vTaskGetRunTimeStats((char *)(tasks_buf + strlen(tasks_buf))); strcat((char *)tasks_buf, “rn”); // 初始化一个 netbuf 并引用 tasks_buf。 sendbuf = netbuf_new(); if(sendbuf != NULL) { netbuf_ref(sendbuf, tasks_buf, strlen(tasks_buf)); } } // 发送结果。 if(sendbuf != NULL) { addr = netbuf_fromaddr(buf); 端口 = netbuf_fromport(buf); netconn_connect(conn, 地址, 端口); netconn_send(conn,sendbuf); netbuf_delete(sendbuf); } else { // 分配新的 netbuf 失败。 } } netbuf_delete(buf); } } } 否则 { netconn_delete(conn); printf(“无法绑定netconn”); } } else { printf(“可以创建新的UDP netconn”); } } /*---------------------------------------------- -------------------------------------*/ void udpecho_init(void) { sys_thread_new(“udpecho_thread” , udpecho_thread, NULL, DEFAULT_THREAD_STACKSIZE, UDPECHO_THREAD_PRIO ); } 运行效果: |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1609 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1540 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
681 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1587 浏览 2 评论
1861浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
528浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
503浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 22:36 , Processed in 0.690115 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号