统计代码耗时长短

#include <stdio.h>
#include <sys/time.h>
#include <time.h>

#define TEST_MAX_SIZE (10)
struct timeval testTime[TEST_MAX_SIZE];
int	testCount[TEST_MAX_SIZE];

struct timeval tmpTime[TEST_MAX_SIZE], tmpTime2;
#define TIME_TEST(index,...) 							\
 do 													\
 {														\
	gettimeofday(&tmpTime[index], NULL);				\
 	__VA_ARGS__											\
 	gettimeofday(&tmpTime2, NULL);						\
 	timeSub(&testTime[index], &tmpTime[index]);			\
 	timeAdd(&testTime[index], &tmpTime2);				\
 	testCount[index]++;									\
 } while (0);


void timeAdd(struct timeval *t1, struct timeval *t2) {
	t1->tv_sec += t2->tv_sec;
	t1->tv_usec += t2->tv_usec;
	if(t1->tv_usec > 1000000) {
		t1->tv_sec++;
		t1->tv_usec -= 1000000;
	}
}


void timeSub(struct timeval *t1, struct timeval *t2) {
	t1->tv_sec -= t2->tv_sec;
	t1->tv_usec -= t2->tv_usec;
	if(t1->tv_usec < 0) {
		t1->tv_sec--;
		t1->tv_usec += 1000000;
	}
}
void printTestResult() {
	int i = 0;
	for(i = 0; i < TEST_MAX_SIZE; i++) {
		fprintf(stderr, "index:%-2d count:%-8d time:%ldms\n", i, testCount[i], testTime[i].tv_sec*1000+testTime[i].tv_usec/1000);
	}
}


main() {

	unsigned int i, j, k = 1;
	float f = 1.23456f;

	TIME_TEST(0,
		i = 0;
		while(i++ < 0x00ffffff) k +=i/k;
	)

	i = 0;
	TIME_TEST(1,
		while(i++ < 0xff) {
			TIME_TEST(2,
				j = 0;
				while(j++ < 0x0000ffff) k +=i/k;
			)
		}
	)

	TIME_TEST(3,
		i = 0;
		while(i++ < 0x00ffffff) f += 1.0f/i;
	)

	printf("k=%d f=%f\n", k, f);
	printTestResult();
}

留作后用
### 关于蓝桥杯嵌入式比赛中长短按键计数(cnt)的实现 在嵌入式开发中,处理按键输入并区分长按和短按是一种常见的需求。通常情况下,这种功能可以通过定时器中断或者软件延时来实现。以下是基于 STM32 的一种具体实现方式。 #### 1. 定义按键状态变量 为了检测按键的状态变化以及记录按下时间,需要定义一些全局变量: ```c volatile uint8_t key_state = 0; // 当前按键状态 (0:未按下, 1:已按下) volatile uint32_t press_time = 0; // 记录按键按下的持续时间 volatile uint16_t short_cnt = 0; // 短按次数计数 volatile uint16_t long_cnt = 0; // 长按次数计数 ``` 上述代码片段用于初始化必要的变量[^1]。 #### 2. 初始化 GPIO 和 TIM 中断 通过 CubeMX 工具配置按键对应的 GPIO 口,并启用外部中断 EXTI 或者使用轮询机制读取按键状态。如果采用定时器,则需设置一个周期性的中断服务程序(ISR),用来监测按键的时间间隔。 - **GPIO 配置**: 将按键连接至某个 GPIO 引脚上,并将其模式设为输入下拉/上拉。 - **TIM 配置**: 使用硬件定时器生成固定频率的滴答信号,在每次触发 ISR 后更新 `press_time` 值。 示例代码如下所示: ```c // 在 HAL 库初始化函数中调用此部分 __HAL_RCC_TIM2_CLK_ENABLE(); // 开启 TIM2 时钟 htim2.Instance = TIM2; htim2.Init.Prescaler = 9999; // 设置预分频系数为 10kHz -> 1ms 滴答一次 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 999; // 自动重装载值为 1s if(HAL_TIM_Base_Init(&htim2) != HAL_OK){ Error_Handler(); } HAL_TIM_Base_Start_IT(&htim2); // 启动带中断的定时器 ``` 以上代码展示了如何利用 HAL 库启动一个每毫秒触发一次的定时器中断[^2]。 #### 3. 编写按键检测逻辑 编写一个独立的任务或回调函数去判断当前是否有键被按下及其类别(即长时间还是短暂点击)。这里提供了一个简单的伪算法流程图作为参考: 当检测到上升沿事件发生时: - 如果之前处于释放状态 (`key_state == 0`) ,则标记进入新的按键过程; - 更新起始时刻戳以便稍后计算实际停留长度; 反之亦然,当下降沿到来意味着松开动作完成之后: - 对比总耗时时长与预定阈值对比得出最终分类结果; - 根据不同情形分别累加对应类型的统计数值; 下面是具体的 C 函数版本描述: ```c void Key_Detect(void){ if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin)==RESET && key_state==0){ // 发生下降沿(按键按下),开始计时 key_state = 1; press_time = __HAL_TIM_GET_COUNTER(&htim2); } if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin)!=RESET && key_state==1){ // 上升沿到达(按键弹起), 结束计时 uint32_t duration = (__HAL_TIM_GET_COUNTER(&htim2)) - press_time; if(duration >= LONG_PRESS_THRESHOLD){ long_cnt++; // 超过设定界限视为长按操作 }else{ short_cnt++; // 正常范围内的触碰判定为单次轻击 } key_state = 0; // 清零标志位等待下次循环重新捕捉新情况 } } ``` 该段落解释了如何依据特定条件调整两个不同的计数器行为^[]^。 --- ####
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值