pico 的两个双核相关函数的延时问题

在PICO平台上,当使用multicore_fifo_pop_timeout_us和multicore_fifo_push_timeout_us函数时,发现延时参数超过特定阈值(如500微秒)会导致延时显著增加,且受主核交互影响。而将参数设置在200微秒以下时,核心1的反馈速度会突然加快,与设定值更吻合。测试代码显示了这种现象,并通过修改延时参数观察到不同行为。
摘要由CSDN通过智能技术生成

pico高级API函数中,
multicore_fifo_pop_timeout_us 和  multicore_fifo_push_timeout_us 的延时参数,
如修改为500微秒以上时,其延时似乎远远超过设定值,其反馈速度似乎被主核的交互所左右 ,而修改为200以下时,反馈出现阶越:运行这两个函数 的core1的打印速度快速增加,显示其延时更加与设定值相符。

测试的代码:



#include <stdio.h>
#include "pico/stdlib.h"



#include "pico/multicore.h"
#define FLAG_VALUE 2

void core1_entry() {

uint32_t g=0;
bool ifthereisp=false;
uint64_t timeout_u=500;   //这儿修改为500微秒以上时,core1的打印速度和core0 1hz基本同步 ,而修改为200以下时,反馈出现阶越:core1的打印速度快速增加。
uint32_t out;

lable2:

 multicore_fifo_push_timeout_us ( FLAG_VALUE,timeout_u) ;

if( !multicore_fifo_pop_timeout_us (timeout_u,&out) )


        printf("Hmm, that's not right on core 1!\n");
    else
        printf("Its all gone well on core 1! %u  \n",out);
goto lable2;
    while (1)
        tight_loop_contents();
}


int main() {
    stdio_init_all();

sleep_ms(1000);
printf("Hello, fakeone\n");

sleep_ms(1000);

multicore_launch_core1(core1_entry);
 uint32_t g=0;

    // Wait for it to start up
lable:

     g = multicore_fifo_pop_blocking();

    if (g != FLAG_VALUE)
        printf("Hmm, that's not right on core 0!\n");
    else {
        multicore_fifo_push_blocking(FLAG_VALUE);
        printf("It's all gone well on core 0!\n");
    }
sleep_ms(1000);
goto lable;

   while (true) {
        printf("Hello, world!\n");
        sleep_ms(1000);
    }
    return 0;
}

关键函数介绍官方原文:

bool multicore_fifo_pop_timeout_us     (     uint64_t      timeout_us,
        uint32_t *      out
    )         

Pop data from the read FIFO (data from the other core) with timeout.

This function will block until there is data ready to be read or the timeout is reached

See the note in the fifo section for considerations regarding use of the inter-core FIFOs
Parameters

timeout_us     the timeout in microseconds
out     the location to store the popped data if available
Returns

true if the data was popped and a value copied into out, false if the timeout occurred before data could be popped


bool multicore_fifo_push_timeout_us     (     uint32_t      data,
        uint64_t      timeout_us
    )         

Push data on to the write FIFO (data to the other core) with timeout.

This function will block until there is space for the data to be sent or the timeout is reached
Parameters

data     A 32 bit value to push on to the FIFO
timeout_us     the timeout in microseconds
Returns

true if the data was pushed, false if the timeout occurred before data could be pushed

附pico例程原代码:


#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/multicore.h"
 
#define FLAG_VALUE 123
 

void core1_entry() {
 
    multicore_fifo_push_blocking(FLAG_VALUE);
 
    uint32_t g = multicore_fifo_pop_blocking();
 
    if (g != FLAG_VALUE)
        printf("Hmm, that's not right on core 1!\n");
    else

        printf("Its all gone well on core 1!");
 
    while (1)
        tight_loop_contents();
}
 

int main() {
    stdio_init_all();
    printf("Hello, multicore!\n");
 
 
    multicore_launch_core1(core1_entry);
 
    // Wait for it to start up

 
    uint32_t g = multicore_fifo_pop_blocking();
 
    if (g != FLAG_VALUE)
        printf("Hmm, that's not right on core 0!\n");
    else {
        multicore_fifo_push_blocking(FLAG_VALUE);
        printf("It's all gone well on core 0!");
    }
 
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值