Rasberry PI PICO (RP2040) продолжение темы

Принимать меры против одновременного доступа из разных потоков. Чтобы не получилось, что один поток попытается прочитать данные в момент, когда второй поток их изменяет

это два ядра, так что у тебя есть шанс

Ну взял и недолго думая шарахнул в конец скетча игры второй скетч в таком виде.

//// ГРАНИЦА РАЗДЕЛА СКЕТЧЕЙ
////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
// тест-скетч для проверки платы (разноцветный блинк по кнопке)(СКЕТЧ №2)
#include <Adafruit_NeoPixel.h>
#define LED_PIN 23 // пин подключения встроенного ws2812b
#define button_PIN 24 // пин подключения встроенной кнопки
Adafruit_NeoPixel strip = Adafruit_NeoPixel(1, LED_PIN, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой.
byte st=0;//
long Y1=0;//
int K=0;//

void setup1 () {
strip.begin();
pinMode(button_PIN,INPUT_PULLUP);
 }
void loop1 () {
strip.setPixelColor(0, 50*(st%2),50*((st/2)%2),50*((st/4)%2));
strip.show();
delay_(200);
strip.setPixelColor(0, 0, 0, 0);
strip.show();
delay_(200);

}
/////
void delay_(int T){
Y1=millis();  
while(millis()-Y1<T){
if(digitalRead(button_PIN)==LOW){
st++;if(st>7){st=0;}delay(200); 
}    
}
}
/////

Не проверял имена переменных на совпадения. И работают!, независимо друг от друга.

и чего бы им не работать )))

Это сколько теперь радости будет у соединителей скетчей :slight_smile:

подводные камни есть везде )))
PS кстати контроллер еще неплохо разгоняется, в два раза легко

так я почти год назад об этом писал :slight_smile:
https://arduino.ru/forum/apparatnye-voprosy/raspberry-pi-pico?page=1#comment-661435

Попробовал более “трудные скетчи слить” по структуре так:

//
#include <biblio.h>//подключаем библиотеки
int per=100;//объявляем,определяем,инициализируем глобальные переменные
void setup (){}//обязательная часть
void loop(){}//обязательная часть
void fun(){}//пишем пользовательские функции 
//// ГРАНИЦА РАЗДЕЛА СКЕТЧЕЙ
#include <biblio1.h>//подключаем библиотеки
int per1=100;//объявляем, определяем, инициализируем глобальные переменные
void setup1 (){}//доп. обязательная часть
void loop1(){}//доп. обязательная часть
void fun1(){}//пишем пользовательские функции   
//

Тоже работают независимо. Но!, явно так быть не должно. К моему примеру: если графику выводить независимо на экраны, а не последовательно, то в какой то момент на одни и те же выводы мк пойдут одновременно и 0 и 1. Т.е. аппаратный SPI 0 не должен управляться с двух ядер одновременно… по идее.
Почитал тему старую… куда и как использовать не понятно где 14 Мб, заявленных продавцом из 16?

Кстати из вариантов применения кроме сливания двух разных скетчей можно второе ядро использовать как альтернативу прерываний?, опрашивать кнопки, датчики, таймеры.

Не пойдут, в инете есть даташит на МК и в нем блок схема, есть и описание в инете по русски, там описано как работает периферия с двумя ядрами.

С ходу не нашёл, но нашёл другую общефилософскую мысль:
Если два ядра будут одновременно обращаться к одной области памяти или к одному и тому же периферийному блоку, их обращения будут автоматически выстраиваться друг за другом и обрабатываться по очереди.

Собственно, именно для разрешения таких конфликтов и нужна ОС, чтобы отдельные процессы взаимодействовали не непосредственно с железом, а с функциями ОС, которые упорядочивают обращения должным образом.

Один процесс установил CS для одного устройства, а другой (по очереди) начинает писать через тот де SPI в другое?
Аппаратура может чередовать максимум элементарные операции, а чтобы изолировать друг от друга длинные последовательности операций нужна ОС. Ну, возможно, может помочь система семафоров, но это замучаешься программировать.

Какие нахрен тут ос и процессы :man_facepalming:

Конкретно в этом МК насколько я понял мультиплексор стоит, который и распределяет обращение к периферии (про память не помню, читать лень).

В sdk pico rp2040 есть примеры межпроцессорного взаимодействия.

В примерах нашёл.

// Demonstrates a simple use of the setup1()/loop1() functions
// for a multiprocessor run.

// Will output something like, where C0 is running on core 0 and
// C1 is on core 1, in parallel.

// 11:23:07.507 -> C0: Blue leader standing by...
// 11:23:07.507 -> C1: Red leader standing by...
// 11:23:07.507 -> C1: Stay on target...
// 11:23:08.008 -> C1: Stay on target...
// 11:23:08.505 -> C0: Blue leader standing by...
// 11:23:08.505 -> C1: Stay on target...
// 11:23:09.007 -> C1: Stay on target...
// 11:23:09.511 -> C0: Blue leader standing by...
// 11:23:09.511 -> C1: Stay on target...
// 11:23:10.015 -> C1: Stay on target...

// Released to the public domain

// The normal, core0 setup
void setup() {
  Serial.begin(115200);
  delay(5000);
}

void loop() {
  Serial.printf("C0: Blue leader standing by...\n");
  delay(1000);
}

// Running on core1
void setup1() {
  delay(5000);
  Serial.printf("C1: Red leader standing by...\n");
}

void loop1() {
  Serial.printf("C1: Stay on target...\n");
  delay(500);
}

Пофиг, можно как угодно использовать, на старом форуме пример есть, одно ядро с sim800l работает, второе с w5500.

чуток расширил тестовый скетч от lilik, теперь тестируется и встроенный светодиод и монитор порта

// тест-скетч для проверки платы (разноцветный блинк по кнопке)
#include <Adafruit_NeoPixel.h>
#define LED_PIN 23 // пин подключения встроенного ws2812b
#define button_PIN 24 // пин подключения встроенной кнопки
Adafruit_NeoPixel strip = Adafruit_NeoPixel(1, LED_PIN, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой.
byte st = 0; //
long Y = 0; //
long old_m;
void setup () {
  Serial.begin(115200);
  strip.begin();
  pinMode(button_PIN, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop () {
  strip.setPixelColor(0, 50 * (st % 2), 50 * ((st / 2) % 2), 50 * ((st / 4) % 2));
  strip.show();
  delay_(200);
  strip.setPixelColor(0, 0, 0, 0);
  strip.show();
  delay_(200);
  Serial.print("Миллис = ");
  Serial.println(millis());
  if(millis() - old_m > 1000){
    old_m = millis();
    digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));
  }
}


/////
void delay_(int T) {
  Y = millis();
  while (millis() - Y < T) {
    if (digitalRead(button_PIN) == LOW) {
      st++; if (st > 7) {
        st = 0;
      } delay(200);
    }
  }
}
/////

Обыскал всю документацию, не нашёл, есть ли в девайсе серийный номер производителя?

два варианта

void pico_get_unique_board_id (pico_unique_board_id_t *id_out)

https://www.raspberrypi.com/documentation/pico-sdk/high_level.html#pico_unique_id

или номер Flash

void flash_get_unique_id (uint8_t *id_out)

еще ссылка по теме
https://stackoverflow.com/questions/72594333/arduino-rp2040-pico-unique-id

купил на Озоне сиреневую с 16МБ. Теперь тесты смогу собирать сам на всё. Люблю тесты на живом железе!
Кто что про сиреневую скажет?

на мой взгляд они все одинаковые :slight_smile:
У меня любые есть - и черненькие, и зелененькие, и сиреневая…