cat-in-136 / ws2812-esp32-rmt-driver

WS2812 driver using ESP32 RMT for Rust
MIT License
40 stars 22 forks source link

Crash by Ws2812Esp32RmtItemEncoder::encode() on m5atom #14

Closed cat-in-136 closed 2 years ago

cat-in-136 commented 2 years ago

Crash occurred by running cargo espflash --example=m5atom_smart_leds on M5 Atom Pixel/Lite.

Error log.

rst:0x7 (TG0WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 188777542, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0048,len:12
ho 0 tail 12 room 4
load:0x3fff0054,len:4800
load:0x40078000,len:17448
load:0x4007c428,len:4840
entry 0x4007c6a0
W (63) boot: PRO CPU has been reset by WDT.
W (63) boot: WDT reset info: PRO CPU PC=0x400872ed
W (63) boot: WDT reset info: APP CPU PC=0x40107206 (waiti mode)

Environment:

$ uname -or
5.16.14-200.fc35.x86_64 GNU/Linux
$ xtensa-esp32-elf-clang --version
xtensa-esp32-elf-gcc (crosstool-NG esp-2021r1) 8.4.0
$ cargo --version
cargo 1.59.0-dev
$ rustc --version
rustc 1.59.0-dev
cat-in-136 commented 2 years ago

Rewritting Ws2812Esp32RmtItemEncoder::encode() as following code resolves the crush issue itself. But pixel are lit with random colors; i.e. phenomenon is changed.

    fn encode(&self, src_slice: &[u8], dest_slice: &mut [rmt_item32_t]) {
        for (k, &v) in src_slice.iter().enumerate() {
            for i in 0..(u8::BITS as usize) {
                dest_slice[k * (u8::BITS as usize) + i].__bindgen_anon_1.val =
                    if v & (1 << (7 - i)) != 0 {
                        self.bit1
                    } else {
                        self.bit0
                    };
            }
        }
    }