while 循环必加sleep,否则编译器会优化

一、while循环条件判断

while (glb_ate_info->test_flow.tester_cmd != TESTER_TX_LDO_TRIM_DONE)
// 注意 != ,才为True

二、while循环,有些编译器会优化

案例一:下面代码,查看汇编,glb_ate_info->test_flow.tester_cmd不会一直去内存取值

while (glb_ate_info->test_flow.tester_cmd != TESTER_TX_LDO_TRIM_DONE);

改措施,会去内存取值

while (glb_ate_info->test_flow.tester_cmd != TESTER_TX_LDO_TRIM_DONE && ATE_DEBUG){
    ate_dly_ms(2);
}

示例一:不加sleep,导致SubStructMsgInfo.size()运行一段时间为0

while (true)
{
    ERROR_LOG << "SubStructMsgInfo: " << SubStructMsgInfo.size() << std::endl;
    if (!SubStructMsgInfo.empty())
    {
    }
    else
    {
        sleep(1);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
周期报文是一种在固定时间间隔内发送的CAN消息,可以使用C语言编写的CAN API来发送。以下是一个简单的C代码示例,可以用来发送周期性的CAN消息: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <time.h> #include "canlib.h" #define CAN_CHANNEL 0 #define CAN_BAUDRATE canBITRATE_250K int main(int argc, char *argv[]) { int canHandle, i; unsigned char msgData[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}; unsigned int msgId = 0x123; int period = 1000; // 发送周期,单位为毫秒 // 初始化CAN通道 canHandle = canOpenChannel(CAN_CHANNEL, canWANT_EXCLUSIVE); if (canHandle < 0) { printf("Failed to open channel, error code: %d\n", canHandle); return -1; } if (canSetBusParams(canHandle, CAN_BAUDRATE, 0, 0, 0, 0, 0) < 0) { printf("Failed to set bus parameters\n"); return -1; } if (canBusOn(canHandle) < 0) { printf("Failed to start CAN bus\n"); return -1; } // 循环发送周期性CAN消息 while (1) { clock_t start_time = clock(); // 记录开始时间 canWriteWait(canHandle, msgId, msgData, sizeof(msgData), canMSG_STD); clock_t end_time = clock(); // 记录结束时间 int elapsed_time = (int)(end_time - start_time) * 1000 / CLOCKS_PER_SEC; // 计算时间差,单位为毫秒 int sleep_time = period - elapsed_time; // 计算需要等待的时间 if (sleep_time > 0) { usleep(sleep_time * 1000); // 等待剩余时间 } } // 关闭CAN通道 canBusOff(canHandle); canClose(canHandle); return 0; } ``` 该代码使用canlib.h头文件中的CAN API函数来初始化CAN通道并发送周期性CAN消息。在循环中,它记录开始时间,发送CAN消息,记录结束时间,计算时间差,并等待剩余时间以保持发送周期。请注意,此示例仅为演示目的,实际应用程序中需要添加错误处理和其他必要的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值