2023年3月31日金曜日

atmega8,attiny10,Uno Latest 4桁7セグ馬鹿ちょん,vnc on ubuntu

atmega8::  https://www.hackster.io/hami/programming-atmega8-using-arduino-ide-90c2ad

flash 8k, flash16k is 168,flash 32k is 328 all need external xtal 16mhzとのこと?要調査!

atmega168:: 吉野さんからもらった中華ボード,arduino as ispでのみ成功

どうもシリアルドライバ不調。。。。minicoreでatmega168をえらびexternal16mhz!

------------------------------------------------------------------

http://morecatlab.akiba.coocan.jp/lab/index.php/2011/10/attiny10/ 

microchip-studioでやってる、arduinoIDEは。。。。ためしてない!

-------------------------------------------

https://iot.keicode.com/arduino/arduino-tm1637.php#2-5 

4桁7セグ LEDのバカちょんモジュール こりゃ便利!

---------------------------------------------------------------

https://blog.desdelinux.net/ja/realvnc-una-excelente-herramienta-de-escritorio-remoto-para-linux/ ゲットしたdebファイルのインストがかいてある!

2023年3月27日月曜日

高野spinlock::mutex,semaphore,barrier(spin/cv/lib),rwlock,スレッドやCV生成は謎

mutex スピンロック方式

#include <pthread.h>

#include <stdbool.h>

#include <stdio.h>

bool test_and_set(volatile bool *p) {

    return __sync_lock_test_and_set(p, 1);

}

void tas_release(volatile bool *p) {

    return __sync_lock_release(p);

}

void spinlock_acquire(volatile bool *lock) { // <1>

    for (;;) {

        while(*lock); // <2>

        if (!test_and_set(lock))

            break;

    }

    // while (test_and_set(lock)); より効率的

}


void spinlock_release(bool *lock) {

    tas_release(lock);

}

bool lock = false; // 共有変数


void* some_func() {

    spinlock_acquire(&lock); // ロック獲得 <1>

       printf("hi\n");// critical section

    spinlock_release(&lock);

    return 0;

}


int main(int argc, char *argv[]) {

    // スレッド生成

    pthread_t th1, th2;


    if (pthread_create(&th1, NULL, some_func, NULL) != 0) {

        perror("pthread_create"); return -1;

    }

    if (pthread_create(&th2, NULL, some_func, NULL) != 0) {

        perror("pthread_create"); return -1;

    }

    // スレッドの終了を待機

    if (pthread_join(th1, NULL) != 0) {

        perror("pthread_join"); return -1;

    }

---------------------------------------------------------------------------------

セマフォ スピンロック方式

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

#define NUM 4 // セマフォの数

#define NUM_THREADS 10 // スレッド数

#define NUM_LOOP 10 // スレッド内のループ数

int cnt = 0; // 共有変数

void semaphore_acquire(volatile int *cnt) { // <1>

    for (;;) {

        while (*cnt >= NUM); // <2>

        __sync_fetch_and_add(cnt, 1); // <3>

        if (*cnt <= NUM) // <4>

            break;

        __sync_fetch_and_sub(cnt, 1); // <5>

    }

}

void semaphore_release(int *cnt) {

    __sync_fetch_and_sub(cnt, 1); // <6>

}

void *th(void *arg) {

    for (int i = 0; i < NUM_LOOP; i++) {

        semaphore_acquire(&cnt);   

  printf("%d\n",cnt);

         // printf("helo\n");

        semaphore_release(&cnt);

    }

    return NULL;

}

int main(int argc, char *argv[]) {

    // スレッド生成

    pthread_t v[NUM_THREADS];

    for (int i = 0; i < NUM_THREADS; i++) {

        pthread_create(&v[i], NULL, th, NULL);

    }

    for (int i = 0; i < NUM_THREADS; i++) {

        pthread_join(v[i],NULL);

    }

    printf("OK!\n");

    return 0;

}

----------------------------------------------------------------
条件変数でバリア同期するのが一般的
// barrier.c
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

pthread_mutex_t barrier_mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t barrier_cond = PTHREAD_COND_INITIALIZER;

void barrier(volatile int *cnt, int max){
    if (pthread_mutex_lock(&barrier_mut) != 0){
        perror("pthread_mutex_lock");
        exit(-1);
    }

    (*cnt)++;

    if(*cnt==max){ // 全プロセスがそろった
        if (pthread_cond_broadcast(&barrier_cond) != 0){
            perror("pthread_cond_broadcat");
        exit(-1);
        }
    } else {
        do { // 全プロセスがそろうまで待機
            if (pthread_cond_wait(&barrier_cond,&barrier_mut) !=0){
                perror("pthread_cond_wait");
                exit(-1);
            } 
        } while(*cnt<max); //疑似覚醒のための条件
    }
    
    if (pthread_mutex_unlock(&barrier_mut)!=0){
        perror("pthread_mutex_unlock");
        exit(-1);
    }

}
使用方法は以下のとうり
// barrier main.c
#include "barrier.c"
#include <pthread.h>
#include <stdio.h>

volatile int num = 0;

void *worker(void *arg){
    barrier(&num, 10);
      printf("start!\n");
    return NULL;
}

int main(int argc, char *argv[]){
    pthread_t th[10];
    for (int i=0; i<10; i++) {
        if (pthread_create(&th[i],NULL,worker,NULL)!=0){
            perror("pthread_create");exit(-1);
        }
    }
    for (int i=0; i<10; i++) {
        pthread_join(th[i],NULL);
    }
    return 0;
}

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

バリア同期(スピンロック方式) 3.6のサンプルにjoin部を付け足して完成

#include <pthread.h>

#include <stdio.h>

void barrier(volatile int *cnt, int max) { // <1>

    __sync_fetch_and_add(cnt, 1); // <2>

    printf("%d\n", *cnt);

    while (*cnt < max); // <3>

}

volatile int num = 0; // 共有変数

void *worker(void *arg) { // スレッド用関数

    barrier(&num, 10); // 全スレッドがここまで到達するまで待つ <1>

    // 何らかの処理

    printf("here i gotup\n");

    return NULL;

}

int main(int argc, char *argv[]) {

    // スレッド生成

    pthread_t th[10];

    for (int i = 0; i < 10; i++) {

        if (pthread_create(&th[i], NULL, worker, NULL) != 0) {

            perror("pthread_create"); return -1;

        }

    }

    for (int i = 0; i < 10; i++) {

        if (pthread_join(th[i], NULL)) {

            perror("pthread_create"); 

            return -1;

        }

    }

      return 0;

}

cf https://chakku.hatenablog.com/entry/2019/05/30/023649 :: time ./a.out

time コマンドは以下のとおり

https://atmarkit.itmedia.co.jp/ait/articles/1810/25/news022.html

------------------------------------------------------------

RWlock スピンロック方式

#include "../3.3/3_3_1_spinlock_2.c"


// Reader用ロック獲得関数 <1>

void rwlock_read_acquire(int *rcnt, volatile int *wcnt) {

    for (;;) {

        while (*wcnt); // Writerがいるなら待機 <2>

        __sync_fetch_and_add(rcnt, 1); // <3>

        if (*wcnt == 0) // Writerがいない場合にロック獲得 <4>

            break;

        __sync_fetch_and_sub(rcnt, 1);

    }

}


// Reader用ロック解放関数 <5>

void rwlock_read_release(int *rcnt) {

    __sync_fetch_and_sub(rcnt, 1);

}


// Writer用ロック獲得関数 <6>

void rwlock_write_acquire(bool *lock, volatile int *rcnt, int *wcnt) {

    __sync_fetch_and_add(wcnt, 1); // <7>

    while (*rcnt); // Readerがいるなら待機

    spinlock_acquire(lock); // <8>

}


// Writer用ロック解放関数 <9>

void rwlock_write_release(bool *lock, int *wcnt) {

    spinlock_release(lock);

    __sync_fetch_and_sub(wcnt, 1);

}


// 共有変数

int  rcnt = 0;

int  wcnt = 0;

bool lock = false;


void reader() { // Reader用関数

    for (;;) {

        rwlock_read_acquire(&rcnt, &wcnt);

        // クリティカルセクション(読み込みのみ)

        rwlock_read_release(&rcnt);

    }

}


void writer () { // Writer用関数

    for (;;) {

        rwlock_write_acquire(&lock, &rcnt, &wcnt);

        // クリティカルセクション(読み書き)

        rwlock_write_release(&lock, &wcnt);

    }

}

。。。。。。。。。。。。。。。。

2023年3月21日火曜日

raspbery pi os 64bit :: Rpi,OpenCV,Julius

 https://torisky.com/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%EF%BC%9Ac%E8%A8%80%E8%AA%9E%E3%81%A7gpio%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E5%88%B6%E5%BE%A1%E3%81%A7%E3%81%8D%E3%82%8Bwiringpi%E3%81%AE%E3%82%A4%E3%83%B3/ :: これでRpiがはいった!

---------------------------------------------------------

https://zenn.dev/karaage0703/articles/3d3d443244da2c :: opencv!!

-----------------------------------------------------------

juliusはクジラどうりであるが、音声出力はVGAのHDMI変換ではだめだった!

2023年3月11日土曜日

BLE/DRV8835 esp32,attiny85,atme328p-16mh/avr on ubuntu

#include <BluetoothSerial.h>


#define LED_PIN 13


BluetoothSerial SerialBT;


void setup() {

  SerialBT.begin("ESP32LED");      // Bluetoothシリアルに「ESP32LED」という名前をつけて初期化

  Serial.begin(115200);            // シリアルモニタの初期化

  pinMode(LED_PIN, OUTPUT);        // LED用のピンの初期化

}


void loop() {

  if (SerialBT.available()) {      // Bluetoothシリアルに受信したかどうかを調べる

    char ch = SerialBT.read();     // 受信した文字を得る

    Serial.println(ch);            // 受信した文字をシリアルモニタに出力

    if (ch == '1') {               // 受信した文字が「1」の場合

      digitalWrite(LED_PIN, HIGH); // LEDを点灯する

    }

    else if (ch == '0') {          // 受信した文字が「0」の場合

      digitalWrite(LED_PIN, LOW);  // LEDを消灯する

    }

  }

}

// 回転速度(35-255)

// ※値が大きいほど高速,余りにも小さい値は回転しません。

const uint8_t speeds =100;

 

void setup() {

  Serial.begin(9600);

}

 

void loop() {

  // 正転(回転)

  Serial.println("正転");

  analogWrite(10,speeds);

  analogWrite(11,0); 

  analogWrite(12,speeds);

  analogWrite(13,0);

  delay(500);

 // ブレーキ

  Serial.println("ブレーキ");

  analogWrite(10,speeds);

  analogWrite(11,speeds);

  analogWrite(12,speeds);

  analogWrite(13,speeds);

  delay(1000);

  // 逆転(逆回転)

  Serial.println("逆転");

  analogWrite(10,0);

  analogWrite(11,speeds);

  analogWrite(12,0);

  analogWrite(13,speeds);

  delay(500);

  

  // ブレーキ

  Serial.println("ブレーキ");

  analogWrite(10,speeds);

  analogWrite(11,speeds);

  analogWrite(12,speeds);

  analogWrite(13,speeds);

  delay(1000);

}

-------------------------------------------------------------------------------

 https://toastedcornflakes.github.io/articles/avr_getting_started.html

atmega328p 16mhz のコード arduinoIDE&usbaspで成功

https://github.com/casebeer/attiny85-hello-world/blob/master/hello.c :: attiny85

-----------------------------------------------------------------------------

ArduinoユーザーのためのATTiny入門 - Qiita 総論的

いまさらATTINY2313 – ともの技術メモ (tomono.tokyo) :: avr-gcc 

AVR試用記-assembly (fc2.com) :: attiny2313 assembler 小山より詳細

AVRマイコンで学ぶコンピュータの仕組み (koyama.verse.jp) 小山サイト

attiny2313 :: flash 2k なのでアセンブリ中心か? ADCがない!かわりにUARTがある!

attiny44a :: flash 4k portA系が入出力っぽいPAxで設定できる portB系は役割不明

attiny13a :: flash 1k なのでアセンブリが中心か?

attiny85 :: flash 8k, lcd1602もライブラリでつかえる!

atmega328p :: flash 32k 8mh/16mhz

attiny861::flash8kを購入予定



2023年3月3日金曜日

xiaopico::freertos on pico、 pico sdk 、attiny13a bitduinoの爆弾

 https://how2electronics.com/getting-started-with-seeed-xiao-rp2040-with-projects/#Source_CodeProgram-2 ;; xiao pico arduinoIDE

---------------------------------------------

Mastering the FreeRTOS Real Time Kernel-A Hands-On Tutorial Guildの日本語訳 - Qiita 

https://www.youtube.com/watch?v=x_kjXl6er4Q を参考にした

コード中の2はxiaopicoではp2(9番ピン)であった raspicoともどもブートを押して

書き込みモードにする必要あり!

#include <FreeRTOS.h>

#include <task.h>

void setup() {

xTaskCreate(blink1, "BLINK1", 128, nullptr, 1, nullptr);

xTaskCreate(blink2, "BLINK2", 128, nullptr, 1, nullptr);

}

void blink1(void *param){

  (void) param;

  pinMode(LED_BUILTIN,OUTPUT);

  while (true) {

    digitalWrite(LED_BUILTIN,LOW);

    delay(100);

    digitalWrite(LED_BUILTIN,HIGH);

    delay(100);

  }

}

void blink2(void *param){

  (void) param;

  pinMode(2,OUTPUT);

  while (true) {

    digitalWrite(2,LOW);

    delay(500);

    digitalWrite(2,HIGH);

    delay(500);

  }

}

void loop() {

  // これがあるとメインCPUが動き、サブがプライオリティ1同士で仕事を並列実行?

   delay(500);

}

---------------pico sdk---------------------------------------------

https://lindevs.com/set-up-raspberry-pi-pico-sdk-on-ubuntu これでcmakeでつまる

https://zenn.dev/suudai/articles/8b484ac39fde38 で成功

https://zenn.dev/kurun/articles/5b713a1a941cbc でtoolchainをインスト

pico-sdkフォルダをつくったら、一旦~にもどりpico-examplesをつくる

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0684 でblink.uf2完成!

https://qiita.com/yunkya2/items/7b9b38b7c8c33a6327af も一応成功したがraspicoで

ないとだめみたい? for freertos sample

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

arduinoIDEによってはusbaspがでてこない!

https://www.jh4vaj.com/archives/27291#i-5 に解決法あり!