在开发pico的过程中,对比着pico官方提供的pico examples开始写多核例程。在一个小坑上兜兜转转好久,姑且把这归结于经验不足吧,先做个简单分享。
开发环境是RTThread Studio,使用生成的模板工程。RTThread不支持pico的多核,使用多核应用可能有内存管理等风险,如何开启先按下不表。作者构思了一个例程,主要流程为:
在main函数中启动core1,构造俩线程开始调度。thread 1内容是按键1开启流水灯1号,thread 2内容是按键2向FIFO发信号,检测FIFO区有无信号,有则开启流水灯2号。
main函数外部有按键检测、FFT、core1_entry函数,core1_entry函数内容为检测FIFO区有无信号,有则开启流水灯3号,并向FIFO发信号。
在实际下载验证时,出现奇奇怪怪的问题,最后认认真真看代码解决了。我主要的问题代码部分在于:
static void num2_thread_entry(void* parameter)
{
while(1)
{
/* */
static uint8_t key2 = 0;
key2 = Key_Scan();
if(key2 == 2)
{
multicore_fifo_push_blocking(EVT1_VAL);
sleep_ms(1000);//这个
}
if(multicore_fifo_rvalid())//还有这个
{
g = multicore_fifo_pop_blocking();
if(g == FLAG_VAL)
{
/* */
}
}
}
}
①在写按键检测的时候,没有加消抖,所以按一次往FIFO加了好多个EVT1_VAL。假如你的multicore_fifo_push_blocking不是在按键检测里的话,就不需要消抖。总而言之是按键检测没做好才会出现的问题。
②设了软件标志位,在读FIFO区数据的时候,首先要multicore_fifo_rvalid一下,这个函数是看FIFO区有无数据,不用这个函数直接multicore_fifo_pop_blocking的话,函数所在的线程会阻塞在这里,一直等待FIFO的数据出现。
/*! \brief Check the read FIFO to see if there is data waiting
* \ingroup multicore_fifo
* 检测FIFO是否有数据。
*
* \return true if the FIFO has data in it, false otherwise
*/
static inline bool multicore_fifo_rvalid() {
return !!(sio_hw->fifo_st & SIO_FIFO_ST_VLD_BITS);
}
multicore_fifo_rvalid函数说明
/*! \brief Push data on to the FIFO.
* \ingroup multicore_fifo
*
* This function will block until there is space for the data to be sent.
* Use multicore_fifo_wready() to check if it is possible to write to the
* FIFO if you don't want to block.
* 函数会阻塞,直到有数据被发送。
*
* \param data A 32 bit value to push on to the FIFO
*/
void multicore_fifo_push_blocking(uint32_t data);
multicore_fifo_pop_blocking函数说明
pico官方文档的建议是不使用FIFO函数,毕竟pico examples中还有quene的例子。核间通信要熟悉原理才能得心应手。之后有空研究下quene的例程,把pico双核用用好。最后着重说明,pico核之间共享内存,而RTThread目前没有适配pico多核,amp、smp都没有,使用需谨慎!