2023年2月25日土曜日

microchip studio/attiny13a,attiny44a,,attiny2313,attiny85,atmega328p,10?,mega8?

https://www.jh4vaj.com/archives/12626v :: avrstudio and usbaspできるげな

8ピンAVR「ATtiny 13A」を買ったので、試しにLチカしてみた | kohacraftのblog 成功

Ubuntu 14.04.3 LTSでAVRマイコン開発 - Qiita ::: avrdudeの話だった

AVR Studio6およびプログラマの使い方 (coocan.jp) :: 非常に丁寧、これだな!

AVRマイコンで学ぶコンピュータの仕組み (koyama.verse.jp) :: 非常に網羅的で親切!

IOポート、Cのマクロ | 始めるAVR (startelc.com) _BVなどのマクロが書いてある

------------attiny13a-------------------------------- 

1.https://qiita.com/yamori813/items/a267af6fd420faa7e030 ::

asm incファイルがないので失敗 makefileまで載っていたのに。。。。

 test: 以下で先頭はタブ!スペースではない!

avr-as -mmcu=attiny13 -o test.o test.s

avr-ld test.o -o test.elf

avr-objcopy -j .text -j .data -O ihex test.elf test.hex

2.arduinoIDEでattiny13aのblink.inoをコンパイルしたhexを以下のように焼き動いた

avrdude -c usbasp -p t13 -U flash:w:"Blink-13a.ino_attiny13a_9600000L.hex":i -v

注:t13aは蹴られた

3.https://over80.hatenadiary.jp/entry/20100506/avr_build :: avr-gccで成功した

       #include <avr/io.h>

   #include <util/delay.h>

   #define BBLED 3 // PB3を示す

  int main(void){

    DDRB = _BV(BBLED); //上でPORTBが出力にセット

     for(;;){

        PORTB ^= _BV(BBLED);

        delay_ms(250);

  }

}

attiny44a::Programming an Attiny44 using an Arduino – Get micros の番号でいけた

PA7は都合のいいことに7だった!

attiny2313::ピン配置は以下のattiny4313を流用で成功した

https://koyama.verse.jp/elecraft/avr/arduino4313.html#CHAP2

atmega328p,attiny85:: 

https://www.instructables.com/Command-Line-Assembly-Language-Programming-for-Ard/ :: ここにattiny85,atmega328pのdef.incがあった


2023年2月22日水曜日

ubuntu22 wifi unstable

 https://qiita.com/dendensho/items/f90aeddcf64f471f1c20

これで解決した! その後の不調は時刻管理で解決

2023年2月20日月曜日

lockfreestack::ARM64 asm :: cargo build OK

https://runebook.dev/ja/docs/rust/reference/inline-assembly :: for reference

cargo build (not using nightly) OK

// main.rs

use std::sync::Arc;

mod stack;


const NUM_LOOP: usize = 1000000; // ループ回数

const NUM_THREADS: usize = 4;    // スレッド数


use stack::Stack;


fn main(){

    let stack = Arc::new(Stack::<usize>::new());

    let mut v = Vec::new();


    for i in 0..NUM_THREADS {

        let stack0 = stack.clone();

        let t = std::thread::spawn(move || {

            if i & 1 == 0 {

                // 偶数スレッドはpush

                for j in 0..NUM_LOOP {

                    let k = i * NUM_LOOP + j;

                    stack0.get_mut().push(k);

                    println!("push: {}", k);

                }

                println!("finished push: #{}", i);

            } else {

                // 奇数スレッドはpop

                for _ in 0..NUM_LOOP {

                    loop {

                        // pop、Noneの場合やり直し

                        if let Some(k) = stack0.get_mut().pop() {

                            println!("pop: {}", k);

                            break;

                        }

                    }

                }

                println!("finished pop: #{}", i);

            }

        });

        v.push(t);

    }


    for t in v {

        t.join().unwrap();

    }


    assert!(stack.get_mut().pop() == None);

}

// stack.rs :: asm! もはやnightlyでなくなっていた
use std::ptr::null_mut; //most important
use std::arch::asm; //most important
// スタックのノード。リスト構造で管理 <1>
#[repr(C)]
struct Node<T> {
    next: *mut Node<T>,
    data: T,
}

// スタックの先頭 <2>
#[repr(C)]
pub struct StackHead<T> {
    head: *mut Node<T>,
}

impl<T> StackHead<T> {
    fn new() -> Self {
        StackHead { head: null_mut() }
    }

    pub fn push(&mut self, v: T) { // <3>
        // 追加するノードを作成
        let node = Box::new(Node {
            next: null_mut(),
            data: v,
        });

        // Box型の値からポインタを取り出す
        let ptr = Box::into_raw(node) as *mut u8 as usize;

        // ポインタのポインタを取得
        // headの格納されているメモリをLL/SC
        let head = &mut self.head as *mut *mut Node<T> as *mut u8 as usize;

        // LL/SCを用いたpush <4>
        unsafe {
            asm!("1:
                  ldxr {next}, [{head}] // next = *head
                  str {next}, [{ptr}]   // *ptr = next
                  stlxr w10, {ptr}, [{head}] // *head = ptr
                  // if tmp != 0 then goto 1
                  cbnz w10, 1b",
                next = out(reg) _,
                ptr = in(reg) ptr,
                head = in(reg) head,
                out("w10") _)
        };
    }

    pub fn pop(&mut self) -> Option<T> { // <5>
        unsafe {
            // ポインタのポインタを取得
            // headの格納されているメモリをLL/SC
            let head = &mut self.head as *mut *mut Node<T> as *mut u8 as usize;

            // popしたノードへのアドレスを格納
            let mut result: usize;

            // LL/SCを用いたpop <6>
            asm!("1:
                  ldaxr {result}, [{head}] // result = *head
                  // if result != NULL then goto 2
                  cbnz {result}, 2f

                  // if NULL
                  clrex // clear exclusive
                  b 3f  // goto 3

                  // if not NULL
                  2:
                  ldr {next}, [{result}]     // next = *result
                  stxr w10, {next}, [{head}] // *head = next
                  // if tmp != 0 then goto 1
                  cbnz w10, 1b

                  3:",
                next = out(reg) _,
                result = out(reg) result,
                head = in(reg) head,
                out("w10") _);

            if result == 0 {
                None
            } else {
                // ポインタをBoxに戻して、中の値をリターン
                let ptr = result as *mut u8 as *mut Node<T>;
                let head = Box::from_raw(ptr);
                Some((*head).data)
            }
        }
    }
}

impl<T> Drop for StackHead<T> {
    fn drop(&mut self) {
        // データ削除
        let mut node = self.head;
        while node != null_mut() {
            // ポインタをBoxに戻す操作を繰り返す
            let n = unsafe { Box::from_raw(node) };
            node = n.next;
        }
    }
}

use std::cell::UnsafeCell;

// StackHeadをUnsafeCellで保持するのみ
pub struct Stack<T> {
    data: UnsafeCell<StackHead<T>>,
}

impl<T> Stack<T> {
    pub fn new() -> Self {
        Stack {
            data: UnsafeCell::new(StackHead::new()),
        }
    }

    pub fn get_mut(&self) -> &mut StackHead<T> {
        unsafe { &mut *self.data.get() }
    }
}

// スレッド間のデータ共有と、チャネルを使った送受信が可能と設定
unsafe impl<T> Sync for Stack<T> {}
unsafe impl<T> Send for Stack<T> {}

2023年2月18日土曜日

アセンブラ一覧 arduino,linux,ULP,ARM64,X64

ArduinoアセンブラでLチカ - Qiita uno assembler

Assembly Programming Linux (mztn.org) linux assembler

ESP ULP::

ESP32のULPアセンブリ言語入門 その1 概要とn進数、単位 | Lang-ship

AArch64::

https://jhalfmoon.com/dbc/2022/12/07/%E3%81%90%E3%81%A0%E3%81%90%E3%81%A0%E4%BD%8E%E3%83%AC%E3%83%99%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B093arm64aarach64%E3%80%81%E3%83%AD%E3%83%BC%E3%83%89%E3%82%B9/

x86-64:: gasm,nasmがあるATT,INTEL記法の違い

http://nw.tsuda.ac.jp/lec/x64/

https://ja.wikibooks.org/wiki/X86%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9/x86%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3#%E6%B1%8E%E7%94%A8%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF_(GPR)

https://ja.wikibooks.org/wiki/X86%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9/%E3%83%87%E3%83%BC%E3%82%BF%E8%BB%A2%E9%80%81%E5%91%BD%E4%BB%A4

2023年2月11日土曜日

avrdude6 on ubuntu, ヒューズビットかきかえ

usbispはもちろんだが、ウインドウとちがってウブンツではarduinoIDEでもavrdudeが

つかえない。しかし、コマンドラインではウブンツでばっちりうごいた!

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

参考サイト 

https://www.jp3cyc.jp/2019/run-arduino-with-internal-clock/

読み出しコマンド

avrdude -c usbasp -p m328p -U lfuse:r:con:h -U hfuse:r:con:h -U efuse:r:con:h

ーーーーーーーーーーーーーーーーーーーーーー上記でヒューズビットをよみだした結果

avrdude: AVR device initialized and ready to accept instructions


Reading | ################################################## | 100% 0.00s


avrdude: Device signature = 0x1e950f (probably m328p)

avrdude: reading hfuse memory:


Reading | ################################################## | 100% 0.00s


avrdude: writing output file "con"


avrdude: safemode: Fuses OK (E:FD, H:DE, L:E2)


avrdude done.  Thank you.

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

書き込みコマンド

https://www.jp3cyc.jp/2019/run-arduino-with-internal-clock/を一部改変
まず328pに16mhz発振併用としておいて
avrdude -c usbasp -p m328p -U lfuse:w:0xe2:m -U hfuse:w:0xde:m -U efuse:w:0xfd:m
で書き換え 16mhz発振は以後は不要
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "0xe2"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.00s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xe2:
avrdude: load data lfuse data from input file 0xe2:
avrdude: input file 0xe2 contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude: reading input file "0xde"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.00s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xde:
avrdude: load data hfuse data from input file 0xde:
avrdude: input file 0xde contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0xfd"
avrdude: writing efuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of efuse written
avrdude: verifying efuse memory against 0xfd:
avrdude: load data efuse data from input file 0xfd:
avrdude: input file 0xfd contains 1 bytes
avrdude: reading on-chip efuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of efuse verified

avrdude: safemode: Fuses OK (E:FD, H:DE, L:E2)

avrdude done.  Thank you.
ーーーーーーーーーーーーーーーーーーーーーー
以下は吉野さんよりattiny85のお話です

Microsoft Windows [Version 10.0.19045.2486]
(c) Microsoft Corporation. All rights reserved.

C:\Users\owner>avrdude -c usbasp -p t85 -U lfuse:r:con:h -U hfuse:r:con:h -U efuse:r:con:h

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e930b (probably t85)
avrdude: reading lfuse memory:

Reading | ################################################## | 100% 0.00s

avrdude: writing output file "con"
0xe2
avrdude: reading hfuse memory:

Reading | ################################################## | 100% 0.00s

avrdude: writing output file "con"
0xdf
avrdude: reading efuse memory:

Reading | ################################################## | 100% 0.00s

avrdude: writing output file "con"
0xff

avrdude done.  Thank you.

20.2. ヒューズ ビット
ATtiny25/45/85には表20-3.~5.で記述されるように3つのヒューズ バイトがあります。ヒューズはプログラムされると、論理0として読まれることに注意してください。

表20-3. 拡張ヒューズ バイト一覧
名称           ビット 意味                                      既定値
-              7~1                                           1 (非プログラム)
SELFPRGEN (注1) 0   自己プログラミング機能許可。                  1 (非プログラム) 自己プログラミング不許可
注1: SPM命令許可。93頁の「フラッシュ メモリの自己プログラミング」をご覧ください。

表20-4. ヒューズ上位バイト一覧
名称           ビット 意味                                          既定値
RSTDISBL(注1,2) 7   PB5がI/OピンかまたはRESETピンかを選択します。   1 (非プログラム) PB5はRESETピン
DWEN (注1,2,3)  6   デバッグWIRE機能許可。                         1 (非プログラム) デバッグWIRE不許可
SPIEN (注4)     5   低電圧直列プログラミング許可。                    0 (プログラム) 低電圧直列プログラミング許可
WDTON (注5)     4   ウォッチドッグ タイマ常時有効。                       1 (非プログラム) WDTはWDTCRで許可
EESAVE          3   チップ消去からEEPROM内容を保護。                1 (非プログラム) EEPROMは未保護
BODLEVEL2       2                                                 1 (非プログラム)
BODLEVEL1       1 低電圧検出(BOD)リセットの制御と検出電圧選択。 (注6) 1 (非プログラム)
BODLEVEL0       0                                                 1 (非プログラム)

注1: RESETピンの使用法を制御します。39頁の「ポートBの交換機能」をご覧ください。
注2: これらのヒューズがプログラム(0)されてしまった後、デバイスは高電圧直列動作でだけプログラミングできます。
注3: 施錠ビット保護が必要とされるとき、非プログラム(1)にされなければなりません。前頁の「プログラム メモリとデータ メモリ用施錠ビット」を
ご覧ください。
注4: このヒューズは低電圧直列プログラミングでアクセスできません。
注5: 詳細については31頁の「WDTCR - ウォッチドッグ タイマ制御レジスタ」をご覧ください。
注6: 111頁の「BODLEVELヒューズ符号化」表をご覧ください。

表20-5. ヒューズ下位バイト一覧
名称         ビット 意味                  既定値
CKDIV8 (注1) 7    システム クロック 8分周選択。 0 (プログラム) 8分周
CKOUT (注2)  6    システム クロック出力許可。   1 (非プログラム) 不許可
SUT1         5                          1 (非プログラム) 起動時間選択。 (注3) 
SUT0         4                          0 (プログラム)
CKSEL3       3                          0 (プログラム)
CKSEL2       2                          0 (プログラム) クロック種別選択。 (注4) 
CKSEL1       1                          1 (非プログラム)
CKSEL0       0                          0 (プログラム)

注1: 詳細については20頁の「システム クロック前置分周器」をご覧ください。
注2: (PB0)ピンに出力することをシステム クロックに許します。詳細については20頁の「クロック出力緩衝部」をご覧ください。
注3: 既定値は既定クロック元に対する最大起動時間を与えます。詳細については18頁の表6-7.をご覧ください。
注4: 既定設定は8MHz校正付き内蔵RC発振器を選択します。詳細については18頁の表6-6.をご覧ください。

施錠ビット1(LB1)がプログラム(0)されると、ヒューズ ビットが固定されることに注意してください。施錠ビットをプログラム(0)する前にヒューズ ビットを
プログラミング(書き込み)してください。ヒューズ ビットの状態はチップ消去によって影響されません。
ヒューズ ビットはデバイス ファームウェアによって読むこともできます。94頁の「ソフトウェアからの施錠,ヒューズと識票のデータ読み出し」項をご覧ください。

20.2.1. ヒューズのラッチ
ヒューズ値はデバイスがプログラミング動作へ移行する時にラッチされ、ヒューズ値への変更はデバイスがプログラミング動作を去るまで無効です。
これは一旦プログラム(0)されると直ぐに効果があるEESAVEヒューズには適用されません。ヒューズは電源投入でもラッチされます