Saya menggunakan penghitung lingkaran, dinyatakan dalam tajuk:
int loop_counter = 0;
Saya menggunakan penghitung ini untuk memicu acara sesering mungkin. Saya dulu menggunakan modulo untuk tipe perilaku yang sama ini, tetapi saya menyederhanakannya sehingga lebih mudah untuk dikerjakan (masih menghasilkan perilaku yang sama)
void loop() {
if(loop_counter > 100) loop_counter = 0;
else loop_counter++;
//Serial.println("hey");
if(loop_counter == 0) {
//do_something_important();
}
}
Semuanya baik dan baik, sampai saya mencoba berkomunikasi dengan Serial
membatalkan komentar //Serial.println("hey");
( "hey"
dalam contoh ini karena, bagi saya, perilaku ini tidak masuk akal).
Ini menghasilkan loop_counter
tidak pernah memicu do_something_important();
bagian kode. Saya mencoba menyatakan loop_counter
sebagai volatile
, itu tidak mengubah apa pun. Aku mencoba Serial.print
ing loop_counter
, dan saya juga mendapatkan perilaku aneh (itu akan membekukan loop). Serial.println("hey");
bekerja dalam arti bahwa di monitor Serial saya mendapatkan banyak "hei", (yaitu dengan cepat lebih dari 100 "heys", jumlah iterasi di mana bagian lain dari kode harus dipicu)
Apa yang mungkin menyebabkan penggunaan Serial
, dengan data yang tidak (sejauh yang saya tahu) terikat untuk loop_counter
sepenuhnya mencegahnya bekerja dengan baik?
EDIT : Ini adalah bagian dari file utama yang akhirnya menimbulkan masalah (well, berkontribusi paling banyak untuk itu (menggunakan terlalu banyak memori)):
void display_state() {
int i,j,index=0;
short alive[256][2];
for(i=0;i<num_rows;i++) {
for(j=0;j<num_cols;j++) {
if(led_matrix[i][j]==1) {
alive[index][0]=i;
alive[index][1]=j;
index++;
}
}
}
alive[index][0]=NULL; //Null-terminate.
alive[index][1]=NULL;
//383 is a great number
for(int idx=0;idx < index; idx++) {
display(alive[idx][0],alive[idx][1]);
delayMicroseconds(283);
}
}
Ini adalah "letters.h":
#ifndef _MY_LETTERS_H #define _MY_LETTERS_H
#define nrows 4 #define ncols 4 #define num_rows 16 #define num_cols 16 #define MAX_WORD_LENGTH 16 #define NUMBER_OF_CHARACTERS 26 #include <stdlib.h>
int loop_counter = 0;loop_counter = 0 ; led_matrix singkat [num_rows] [num_cols];led_matrix singkat [ num_rows ] [ num_cols ];
const short letter_a [nrows] [ncols] = {{0,1,1,0}, letter_a [ nrows ] [ ncols ] = {{ 0 , 1 , 1 , 0 } pendek , {1,0,0,1},{ 1 , 0 , 0 , 1 }, {1,1,1,1},{ 1 , 1 , 1 , 1 }, {1,0,0,1}};{ 1 , 0 , 0 , 1 }}; const short letter_b [nrows] [ncols] = {{1,0,0,0}, {1,1,1,0}, {1,0,1,0}, {1,1,1,0} };const short letter_b [ nrows ] [ ncols ] = {{ 1 , 0 , 0 , 0 }, { 1 , 1 , 1 , 0 }, { 1 , 0 , 1 , 0 }, { 1 , 1 , 1 , 0 } }; const short letter_c [nrows] [ncols] = {{0,1,1,1}, {1,0,0,0}, {1,0,0,0}, {0,1,1,1} };const short letter_c [ nrows ] [ ncols ] = {{ 0 , 1 , 1 , 1 }, { 1 , 0 , 0 , 0 }, { 1 , 0 , 0 , 0 }, { 0 , 1 , 1 , 1 }} }; const short letter_t [nrows] [ncols] = {{1,1,1,1}, {0,1,0,0}, {0,1,0,0}, {0,1,0,0} };const short letter_t [ nrows ] [ ncols ] = {{ 1 , 1 , 1 , 1 }, { 0 , 1 , 0 , 0 }, { 0 , 1 , 0 , 0 }, { 0 , 1 , 0 , 0 } };
typedef struct letter_node { struct letter_node { const * data pendek;const * data pendek ; letter_node * selanjutnya;* selanjutnya ; int x;int x ; int y;int y ; } letter_node;} letter_node ;
letter_node aa = {& letter_a [0] [0], NULL, 1,1};= {& letter_a [ 0 ] [ 0 ], NULL , 1 , 1 }; letter_node bb = {& letter_b [0] [0], NULL, 1,1};= {& letter_b [ 0 ] [ 0 ], NULL , 1 , 1 }; letter_node cc = {& letter_c [0] [0], NULL, 1,1};= {& letter_c [ 0 ] [ 0 ], NULL , 1 , 1 }; letter_node tt = {& letter_t [0] [0], NULL, 1,1};= {& letter_t [ 0 ] [ 0 ], NULL , 1 , 1 };
letter_node letter_map [NUMBER_OF_CHARACTERS];[ NUMBER_OF_CHARACTERS ]; #berakhir jika#berakhir jika
Beberapa informasi lebih lanjut: - Saya menggunakan Uno (ATMega328)
sumber
loop()
fungsi. Bagaimana saya harus mengecat stack saya jika satu-satunya metode output yang saya miliki (Serial.print()
) gagal saya?Jawaban:
Saya juga punya masalah yang mirip dengan ini, dan saya sangat yakin bahwa Anda juga keluar dari ruang stack terkait. Coba menyusutkan kode sebanyak mungkin.
Dalam kode kasus saya kadang-kadang akan berjalan ketika saya memiliki pesan serial di dalamnya, tetapi kemudian tampaknya tidak berjalan ketika saya tidak. Saya juga punya kasus di mana mengirim pesan serial akan menyebabkan arduino mereset tanpa henti.
Saya juga menggunakan arduino328. Kemungkinan Anda harus mengurangi ukuran array Anda jika Anda memiliki ukuran terkecil yang dapat diterima.
sumber
Apakah kode Anda menginisialisasi port serial? Misalnya.
Gagal melakukan ini dapat menyebabkan kerusakan pada penggunaan pertama serial.
sumber
Mungkin Anda kehabisan memori? Semua string yang Anda cetak dengan Serial.print ("sesuatu") terjadi di SRAM, sama dengan jumlah karakter dari string itu + 1 untuk terminator \ 0. Dimungkinkan untuk kehabisan memori bahkan jika ukuran kompilasi sketsa Anda jauh lebih kecil daripada memori flash Arduino, karena SRAM hanya 2048 byte untuk Atmega328 dan 1024 byte untuk Atmega 168. Saya punya masalah yang sama, yang saya selesaikan dengan memperpendek semua teks dan menghapus pesan debug yang tidak perlu.
sumber
display_state()
fungsi untuk tidak memerlukan alokasi tambahan itu. Saya jarang melakukan pemrosesan tertanam, saya kira kita semua harus menabrak dinding memori di beberapa titik!Anda belum menunjukkan kode yang menginisialisasi variabel "loop_counter". Apakah itu di luar rutinitas loop () ?
Apakah Anda mungkin mendeklarasikannya sedemikian rupa sehingga berbatasan dengan area penyimpanan memori lain yang beroperasi di luar ukurannya yang dinyatakan dan ini menginjak-injak variabel loop_counter?
sumber
loop()
, dll. Apakah Anda mengatakan bahwaSerial.print()
metode itu mungkin menimpanya?Saya tidak melihat kode Anda di mana Anda menelepon
loop()
. Itu juga tidak terlihat seperti Anda menggunakan diloop_counter
luar fungsi itu. Apakah ada alasan Anda menyatakannya global? Saya berasumsi itu karena Anda ingin mempertahankan nilainya di antara panggilan. Anda bisa melakukan ini dengan variabel lokal statis sebagai gantinya.Itu harus memastikan bahwa tidak ada fungsi eksternal lain yang dapat menginjaknya. Anda harus selalu mendeklarasikan variabel Anda dalam ruang lingkup sekecil mungkin untuk menghindari perilaku yang tidak diinginkan.
Jika itu tidak berhasil, Anda harus benar-benar menganalisis penggunaan memori Anda. Periksa Tanya Jawab EE.SE ini untuk berbagai kode sampel untuk melakukan ini dalam Arduino.
sumber
setup()
danloop()
merupakan fungsi yang Arduino berjalan secara default,setup()
pertama,loop()
kedua.loop()
pada dasarnya sepertimain()
, kecuali disebut berulang kali. referensi: arduino.cc/en/Reference/loop Saya akan memeriksa tautan itu.Serial.print()
. Sepertinya saya harus keluar dariprocessing
IDE normal jika saya ingin dapat menggunakan GDBSerial.print()
itu berfungsi dengan baik karena banyak mencetak "hei". Ituloop_counter
yang memberimu masalah. Coba hapusif(loop_counter == 0)
kode dan masukkanget_free_memory()
kode (tinggalkanloop_counter
kenaikan) dan jalankan. Setidaknya ini akan memberi tahu Anda jika Anda memiliki masalah besar dengan alokasi memori Anda.Pustaka serial perangkat lunak Arduino menggunakan interupsi. (lihat "softwareSerial.cpp, .h"). Anda mungkin memiliki masalah ketika ISR "melangkah" pada kode utama (atau sebaliknya). Coba gunakan bendera interlock, sehingga kode menunggu sementara operasi cetak selesai.
sumber
Pada satu titik beberapa waktu yang lalu saya mendapat kesan memiliki masalah yang sama. Saat itu, saya menyelesaikannya dengan menambahkan penundaan (1) di depan atau setelah serial.println. Itu dengan Arduino 0022 di Linux. Tidak yakin papan mana itu, mungkin serial Boarduino. Juga tidak bisa mereproduksi.
Saat ini, ini berfungsi untuk saya di boarduino USB dengan Arduino 1.01 di Windows:
sumber