Array of arrays in PROGMEM for AVR MCUs.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. http://snippets.artvolk.sumy.ua/view/141/massiv-massivov-v-progmem-dlya-mikrokontrollerov-avr
  3. Когда совсем запутался с массивами массивов, хранимых во флеш-памяти
  4. микроконтроллера AVR решил набросать такую демку и проверить всё в
  5. симуляторе с отладчиком. Вроде бы разобрался, возможно, кому-нибудь ещё
  6. пригодится.
  7. Особенно понравился доступ к массивам не так: a[2], а вот так: 2[a]
  8. (это работает для любых массивов в C) :-)
  9. */
  10. #include <avr/io.h>
  11. #include <avr/pgmspace.h>
  12. #define NUM_ELEM(x) (sizeof (x) / sizeof (*(x)))
  13. const uint8_t array1[] PROGMEM = {1,2,3,4,5};
  14. const uint8_t array2[] PROGMEM = {6,7,8,9,10,11,12};
  15. const uint8_t* my_arrays[] PROGMEM = {
  16. array1,
  17. array2
  18. };
  19. uint8_t* current;
  20. uint8_t x, size;
  21. int main(void)
  22. {
  23. /*
  24. Description: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=38003
  25. */
  26. x = pgm_read_byte(&array1[3]); // read 4rd element of first array
  27. // Read using pointer to array1
  28. current = (uint8_t*)array1;
  29. x = pgm_read_byte(current + 2); // read 3rd element of first array
  30. // Size of one array
  31. size = NUM_ELEM(array1);
  32. // Read using pointer to array2
  33. current = (uint8_t*)array2;
  34. x = pgm_read_byte(current+1); // read 2nd element of second array
  35. // Read using pointer from pointer table in Flash
  36. current = (uint8_t*)pgm_read_word(my_arrays+1);
  37. x = pgm_read_byte(current+5); // read #6 element of second array
  38. // Read using pointer from pointer table in Flash (different syntax)
  39. current = (uint8_t*)pgm_read_word(&my_arrays[1]);
  40. x = pgm_read_byte(current+6); // read #7 element of second array
  41. x = pgm_read_byte(&current[5]); // read #6 element of second array
  42. x = pgm_read_byte(&2[current]); // freaky one :)
  43. // Size of pointer arrays
  44. size = NUM_ELEM(my_arrays);
  45. while(1)
  46. {
  47. }
  48. }