Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Section .idata and linker
23-03-2014, 07:28 AM, (This post was last modified: 23-03-2014, 07:31 AM by Callmea.)
#1
Section .idata and linker
Hello,

I m porting the Adafruit PCD8544 + Adafruit GFX (the mix of the two libs inside one) c++ libs for nokia 3310/5510 monochrome lcd to C on my pinguino 4550 board.

I m new to sdcc and pics, and I have got an error when I try to link :

Code:
"linker script has no definition that matches the type of section ".idata".
I don't know how to solve this problem, I thank you for you help.
I suppose (maybe i'm wrong), that the reason is the size of theses two arrays :
Code:
u8 pcd8544_buffer[LCDBUFFERSIZE] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,etc...}
Note LCDBUFFERSIZE=504 (nb of pixel of lcd screen)

and
static const unsigned char font[]  = {bla,bla etc.. *x};

I know that Adafruit use the directive PROGMEM, who seems to be unavailable on sdcc so I removed it and wrote
Code:
#define PROGMEM /* empty */
#define pgm_read_byte(x) (*(x))
#define pgm_read_word(x) (*(x))
#define pgm_read_float(x) (*(x))


I ve goggled and found things about udata and lkr files, I have tried to add
Code:
#pragma udata gpr3 buffer
before

Code:
static const unsigned char font
without success.

What can I do to link my program using this lib?

I thank you for your help, and i m sorry if it s a newbie question, i begin with pinguino and sdcc Smile
Reply
23-03-2014, 08:53 AM,
#2
RE: Section .idata and linker
(23-03-2014, 07:28 AM)Callmea Wrote: Hello,

I m porting the Adafruit PCD8544 + Adafruit GFX (the mix of the two libs inside one) c++ libs for nokia 3310/5510 monochrome lcd to C on my pinguino 4550 board.

I m new to sdcc and pics, and I have got an error when I try to link :

Code:
"linker script has no definition that matches the type of section ".idata".
I don't know how to solve this problem, I thank you for you help.
I suppose (maybe i'm wrong), that the reason is the size of theses two arrays :
Code:
u8 pcd8544_buffer[LCDBUFFERSIZE] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,etc...}
Note LCDBUFFERSIZE=504 (nb of pixel of lcd screen)

and
static const unsigned char font[]  = {bla,bla etc.. *x};

I know that Adafruit use the directive PROGMEM, who seems to be unavailable on sdcc so I removed it and wrote
Code:
#define PROGMEM /* empty */
#define pgm_read_byte(x) (*(x))
#define pgm_read_word(x) (*(x))
#define pgm_read_float(x) (*(x))


I ve goggled and found things about udata and lkr files, I have tried to add
Code:
#pragma udata gpr3 buffer
before

Code:
static const unsigned char font
without success.

What can I do to link my program using this lib?

I thank you for your help, and i m sorry if it s a newbie question, i begin with pinguino and sdcc Smile
Bonjour,
Je suppose que tu utilises boot4.18f4550.lkr.
Modifies les 3 lignes :
DATABANK NAME=gpr1 START=0x100 END=0x1FF
DATABANK NAME=gpr2 START=0x200 END=0x2FF
DATABANK NAME=gpr3 START=0x300 END=0x3FF
en
//DATABANK NAME=gpr1 START=0x100 END=0x1FF
//DATABANK NAME=gpr2 START=0x200 END=0x2FF
DATABANK NAME=gpr3 START=0x100 END=0x3FF
et les 2 suivantes :
DATABANK NAME=gpr6 START=0x600 END=0x6FF
DATABANK NAME=gpr7 START=0x700 END=0x7FF
en
//DATABANK NAME=gpr6 START=0x600 END=0x6FF
DATABANK NAME=gpr7 START=0x600 END=0x7FF
afin d'avoir des blocks de 738 et 512 bytes.

Enlèves #pragma udata gpr3 buffer.
Cela suffira peut-être pour loger pcd8544_buffer et font ?
André
Reply
23-03-2014, 07:35 PM, (This post was last modified: 23-03-2014, 09:28 PM by Callmea.)
#3
RE: Section .idata and linker
Bonjour André,

Un grand merci, cela a fonctionné parfaitement Smile

Aurais-tu des liens/doc expliquant tout ça? je te remercie. J'ai cherché sur Google (et peut être mal), téléchargé le manuel de sdcc, mais je n'ai pas trouvé grand chose.

Comme dit dans un autre de mes posts , je n'étais pas fan de ces deux librairies à cause de leur lourdeur, mais elles sont complètes d'un point de vue primitives graphiques et adressage des pixels individuels (via un buffer).

Donc je viens de tester la librairie, elle fonctionne (un bug sur les font, à mon avis il va falloir que je remplace le pgm_read, ça semble être une erreur de pointeurs) très bien mais elle est un peu lente (J ai du désactiver la méthode fastpiwrite, trop avr like par un shifout). Je vais essayer d'y intégrer une fonction spi hardware.

Par contre, a l'heure actuelle elle est inexploitable sur un pic 18F4550 car elle prends trop de place Sad
Code:
code size: 28332 / 29696 bytes (95% used)
3.0 secondes (traitement)

Les 2 libs, plus le programme d'exemple prenaient 16ko sur Arduino, j'espérais gagner un peu en ne faisant que du pur C, et en fusionnant les deux libs, c'est raté :/

Aurais tu (toi ou d autres utilisateurs Pinguino 8 bits) des conseils/liens/docs sur l'optimisation de code sur pinguino/pic/sdcc?

Le C ne me pose pas de soucis mais n'étant pas habitué aux micro contrôleurs et aux faibles ressources, je prends tous les conseils Smile.

Néanmoins, une fois le bug corrigé, et ce même si je n'arrivais pas à optimiser cette lib, je la mettrais en partage, ainsi la communauté pourra en profiter surtout les utilisateurs ayant un pic avec plus de flash Big Grin

En te remerciant encore,

Bonne fin de dimanche,
Thomas

Edit : Comme j'ai désactivé les inline car sdcc ne supporte pas le C99, je me demande si il y a un risque à rajouter dans le fichier pinguino.py l'option –std-sdcc99 afin d activer notamment le support des fonctions inline?
Reply
24-03-2014, 09:24 AM,
#4
RE: Section .idata and linker
(23-03-2014, 07:35 PM)Callmea Wrote: Bonjour André,

Un grand merci, cela a fonctionné parfaitement Smile

Aurais-tu des liens/doc expliquant tout ça? je te remercie. J'ai cherché sur Google (et peut être mal), téléchargé le manuel de sdcc, mais je n'ai pas trouvé grand chose.

>>>> C'est au coup par coup que j'ai appris quelques trucs tel que l'utilisation des .lkr. Nos échanges avec Régis m'ont bien servi aussi.
Les liens/doc que j'ai pu utiliser ne donnent le plus souvent qu'une réponse partielle à la programmation des uC. Ils sont néanmoins très utiles quand on est éloigné de personnes bien expérimentées.>>>>>

Comme dit dans un autre de mes posts , je n'étais pas fan de ces deux librairies à cause de leur lourdeur, mais elles sont complètes d'un point de vue primitives graphiques et adressage des pixels individuels (via un buffer).

Donc je viens de tester la librairie, elle fonctionne (un bug sur les font, à mon avis il va falloir que je remplace le pgm_read, ça semble être une erreur de pointeurs) très bien mais elle est un peu lente (J ai du désactiver la méthode fastpiwrite, trop avr like par un shifout). Je vais essayer d'y intégrer une fonction spi hardware.

Par contre, a l'heure actuelle elle est inexploitable sur un pic 18F4550 car elle prends trop de place Sad
Code:
code size: 28332 / 29696 bytes (95% used)
3.0 secondes (traitement)

Les 2 libs, plus le programme d'exemple prenaient 16ko sur Arduino, j'espérais gagner un peu en ne faisant que du pur C, et en fusionnant les deux libs, c'est raté :/

Aurais tu (toi ou d autres utilisateurs Pinguino 8 bits) des conseils/liens/docs sur l'optimisation de code sur pinguino/pic/sdcc?

>>>>>>Par expérience (le bootloader V4 entre autres) l'asm permet de réduire le code compilé. C'est ce qu'a fait Régis pour le V4.
Sinon il faudrait voir ton code C pour réellement trouver ce qui peut-être optimisé.
As-tu pensé travaillé en mode ISCP ? Si par exemple tu utilises cette lib en permanence pour une appli pourquoi garder le boot ? Ce qui fait 3000 octets d'utilisable.<<<<<<

Le C ne me pose pas de soucis mais n'étant pas habitué aux micro contrôleurs et aux faibles ressources, je prends tous les conseils Smile.

Néanmoins, une fois le bug corrigé, et ce même si je n'arrivais pas à optimiser cette lib, je la mettrais en partage, ainsi la communauté pourra en profiter surtout les utilisateurs ayant un pic avec plus de flash Big Grin

>>>>>>>>Et nous t'en remercions d'avance. Par la même occasion nous pourrions voir ce qui est optimisable.<<<<<<<<

>>>>>>>N'hésites pas à nous interroger.
Pour ma part j'ai travaillé sur la lib FATFS/SD. J'y travaille encore pour la rendre partiellement utilisable pour les 18fx550.

L'I2C, le SPI ? J'ai amélioré ces lib dans le cas de uC master et uC slave.

L'interfaçage PC /uC avec l'USB/BULK ou l'USB/CDC en utilisant Processing/Java ou Python j'y ai tâté.<<<<<<


En te remerciant encore,

Bonne fin de dimanche,
Thomas

Edit : Comme j'ai désactivé les inline car sdcc ne supporte pas le C99, je me demande si il y a un risque à rajouter dans le fichier pinguino.py l'option –std-sdcc99 afin d activer notamment le support des fonctions inline?

>>>>>>A voir par Régis ?<<<<<<
>>>>>> A très bientôt <<<<<<
Reply
24-03-2014, 05:53 PM, (This post was last modified: 24-03-2014, 06:04 PM by Callmea.)
#5
RE: Section .idata and linker
Bonjour,

Encore Merci pour ces réponsesSmile
Quote: C'est au coup par coup que j'ai appris quelques trucs tel que l'utilisation des .lkr. Nos échanges avec Régis m'ont bien servi aussi.
Les liens/doc que j'ai pu utiliser ne donnent le plus souvent qu'une réponse partielle à la programmation des uC. Ils sont néanmoins très utiles quand on est éloigné de personnes bien expérimentées.

Je continue mes recherches sur ce sujet. ça me rappelle de bons souvenirs les ucs, quand je programmais sur les vieux ordinateurs (notamment Amiga et Thomson TO7 ) ou je ne disposais que de ressources limitées.Alors j essaie de reprendre les habitudes oubliées, même si à force de coder sur pc on les oublie. Vous avez l'air toi et regis, très impliqués sur ce projet syumpathiqueSmile

Quote:Sinon il faudrait voir ton code C pour réellement trouver ce qui peut-être optimisé.
As-tu pensé travaillé en mode ISCP ? Si par exemple tu utilises cette lib en permanence pour une appli pourquoi garder le boot ? Ce qui fait 3000 octets d'utilisable.
Tu as tout à fait raison, sur le fait du bootloader. En fait mon projet, sommes toute simple, est de réaliser un mini micro ordinateur architecturé bizarrement, C'est à dire que je voulais un pic18F4550 (Je fais selon mon stock) avecbootloader pinguino, chargé de faire acte de controleur graphique (pour cet ecran Nokia voire un autre) + entrees, son (avec un petit dac simple i2s et un petit ampli à 6 pattes) et serveur de fichiers Hexs sur carte SD pour un pic18F4865 via un bootloader tiny serie. Un peu tordu je le reconnais Big Grin. Du coup je pense que je vais me rabattre sur 2 4865, ce qui me laissera plus de lattitude. A moins que je trouve en 8 bit un pic18 semblable compatible Pinguino. je fais ça dans le but d apprendre (j ai débuté l electronique il y a 2-3 mois, et je suis encore loin de maitriser), car pour l utilité d'un tel gadget, à part faire de petits jeux, je ne vois pas encore... Big Grin

Quote:>>>>>>>>Et nous t'en remercions d'avance. Par la même occasion nous pourrions voir ce qui est optimisable.<<<<<<<<

>>>>>>>N'hésites pas à nous interroger.
Pour ma part j'ai travaillé sur la lib FATFS/SD. J'y travaille encore pour la rendre partiellement utilisable pour les 18fx550.

L'I2C, le SPI ? J'ai amélioré ces lib dans le cas de uC master et uC slave.

L'interfaçage PC /uC avec l'USB/BULK ou l'USB/CDC en utilisant Processing/Java ou Python j'y ai tâté.<<<<<<

Merci à vous également pour ce projet et de l'aide que vous apportez toi, Régis et les autres membres. L'ecran est d'ailleurs au format SPI, format que je n'ai pas encore implémenté dans la lib, mais je me penche sur ces libs en ce moment en étudiant les sources justement. Je te remercie de ta proposition et n'hésiterais pas à te consulter, surtout que mes pics vont communiquer par ce protocole que j ai pu tester sur Arduino.

Par contre pour l'assembleur pic que je ne connais pas et le python encore moins, là je suis dépassé Smile

A propos du std99_c, j'ai testé en l'intégrant dans le pinguino.py, et je confirme que ça créé une sacré pagaille.. J'ai vu dans la docde sdcc, que via des pragmas on pouvais passer une partie du code en C99, ça fonctionne certes, mais toujours impossible à utiliser des fonctions inlines :-(

Pour la librairie voici un point, je pense la mettre en ligne rapidement, elle fonctionne correctement il me reste à :
  1. Créer une fonction println.
    J'ai déja implémenté un print standard, mais régis sur un autre post m'a donné des pistes que je vais creuser. Je le fais pour les utilisateurs car je n'utilise jamais cette fonction

  2. Créer un fichier pdl.
    J'en ai créé un pour le premier jet, ça va aller très vite. Par contre je ne sais pas si cela est vraiment utile de conserver la syntaxe c++ genre f8544lcd.write()?. Pour l'instant je passe par un include.

Ce qui a déja été fait (et qui devra je pense être optimisé)
  • Portage en C de la librairie.

    Je voulais en faire une librairie multi écran, contrairement à ce qui a été fait dans la lib originelle C++ (un seul buffer global)à savoir une structure pour chaque ecran. J'ai du revoir mes pretentions à la baisse au vu de la taille de la lib.

  • Suppression / Modification de tout ce qui était AVR (pas grand chose) et tentatives d'optimisations

  • Suppression de fonctions qui ne faisaient que renvoyer, ou setter des attributs de structure pour optimiser le code, remplacées par des #define nomdefonction(arg)

  • Remplacement de toutes les mutiplications /divisisons par des decallages de bits , quand cela a été possible par des décallages de bits

  • Récriture de certaines functions, comme le Draw circle par un autre algorithme plus rapide et moins gourmand.

Cette lib ne sera que provisoire, et je compte en écrire une from scratch dès que j'aurais un peu de temps, à moins d'en trouver une open source complète. En effet celle-ci, bien qu'en licence BSD, impose le splash screen d'Adafruit plus une publicité pour leur produit dans le code, ce qui me dérange un peu mais si j'ai respecté ce choix.

Edit : La taille de la librairie, avec un juste un exemple d affichage de texte fait maintenant environ 18ko.
La version avec tous les exemples fournis par adafruit fait 27,4 ko.
Bonne journée,
Thomas
Reply
31-03-2014, 02:19 AM,
#6
RE: Section .idata and linker
Bonsoir,

J'ai mis en partage le portage de la libraire d'Adafruit pour les lcd nokia sur sourceforge.

J'ai créé un post sur le forum dans la rubrique display. En espérant qu'elle puisse être utile à d'autres Smile

Bonne soirée,
Thomas
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)