collapse

* Links de Robótica

* Posts Recentes

Preços e fabricantes de pcb por Sérgio_Sena
[Hoje às 10:20]


Palavras Cruzadas por Njay
[Hoje às 02:24]


Isaac Asimov - I, Robot por senso
[Ontem às 03:41]


Apresentação por TigPT
[17 de Setembro de 2017, 07:31]


ic SL440 da Plessey? por senso
[16 de Setembro de 2017, 13:11]


Compra Colectiva RS-Amidata por brunus
[15 de Setembro de 2017, 22:31]


Ideias para construir um quadrúpede simples por zordlyon
[15 de Setembro de 2017, 10:18]


Preparar bancada de testes por jm_araujo
[14 de Setembro de 2017, 10:24]


Mitos: mudança da ilumação tradicional p/ iluminação a LEDs? por LVirtual
[14 de Setembro de 2017, 07:46]


IPV4 IPV6 por Hugu
[13 de Setembro de 2017, 22:01]

Autor Tópico: Variáveis locais a escreverem sobre variáveis globais?  (Lida 6210 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.223
    • Clube de Robotica
Variáveis locais a escreverem sobre variáveis globais?
« em: 08 de Abril de 2015, 19:01 »
Ora boas tardes a todos.

Tou aqui com um problema par ao qual não encontro solução e estava com esperança que me ajudassem.

Estou a fazer uma biblioteca em C, bem, mais umas funções para ser facil use um modulo UART com DMA.
Tenho tudo num library.c e library.h.

Depois no main.c tenho uma variavel local, char a[100] que, apesar de o endereço começar bem atrás, acaba por ir para cima das variáveis globais dentro de library.c

Alguem me pode dizer o que estou a fazer mal? Possivelmente o compilador está a gerir mal a tabela "a" por ser tão grande?
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.726
Re: Variáveis locais a escreverem sobre variáveis globais?
« Responder #1 em: 08 de Abril de 2015, 19:03 »
Ora boas tardes a todos.

Tou aqui com um problema par ao qual não encontro solução e estava com esperança que me ajudassem.

Estou a fazer uma biblioteca em C, bem, mais umas funções para ser facil use um modulo UART com DMA.
Tenho tudo num library.c e library.h.

Depois no main.c tenho uma variavel local, char a[100] que, apesar de o endereço começar bem atrás, acaba por ir para cima das variáveis globais dentro de library.c

Alguem me pode dizer o que estou a fazer mal? Possivelmente o compilador está a gerir mal a tabela "a" por ser tão grande?

So' estou a ver isso acontecer se a RAM não for suficiente.

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.223
    • Clube de Robotica
Re: Variáveis locais a escreverem sobre variáveis globais?
« Responder #2 em: 08 de Abril de 2015, 19:04 »
256KB :/ Por isso duvido
Até mesmo pelo que está no código mas vou ver melhor
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.223
    • Clube de Robotica
Re: Variáveis locais a escreverem sobre variáveis globais?
« Responder #3 em: 08 de Abril de 2015, 19:06 »
Nope. O .map diz que sobra 254816 bytes e sei que as locais não ultrapassam isso :/





So' estou a ver isso acontecer se a RAM não for suficiente.

Afinal era mesmo isso. Lembrei-me que se calhar há um limite na stack e havia mesmo! Tava só para 512 bytes :p
Alterei e parece estar bem. Obrigado, não me teria lembrado que podia ser falta de RAM!
Com isto já levei cá tanta porrada desse tipo de cenas.
« Última modificação: 08 de Abril de 2015, 19:11 por LuísR.A. »
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.389
  • Helpdesk do sitio
Re: Variáveis locais a escreverem sobre variáveis globais?
« Responder #4 em: 08 de Abril de 2015, 19:11 »
Posta o código..
Mas se isso é um buffer circular devia ser uma potência de 2, os bounds check são optimizados para AND's e pouco mais.
Avr fanboy

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.223
    • Clube de Robotica
Re: Variáveis locais a escreverem sobre variáveis globais?
« Responder #5 em: 08 de Abril de 2015, 19:16 »
Era na verdade só uma string C para testes.

Isso depois passava para um buffer (ainda não circular mas têm 1024 bytes) e depois enviava. Mas vá foi mesmo estupidês minha  ;D
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.389
  • Helpdesk do sitio
Re: Variáveis locais a escreverem sobre variáveis globais?
« Responder #6 em: 08 de Abril de 2015, 19:17 »
Qual é a solução então?
Avr fanboy

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.223
    • Clube de Robotica
Re: Variáveis locais a escreverem sobre variáveis globais?
« Responder #7 em: 08 de Abril de 2015, 19:21 »
O problema era o tamanho da stack definido pelo compilador. Estava definido para um máximo de 512 bytes.
 Aumentei e deu tudo bem :D
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.389
  • Helpdesk do sitio
Re: Variáveis locais a escreverem sobre variáveis globais?
« Responder #8 em: 08 de Abril de 2015, 19:25 »
Isso das stacks é coisa que me continua a fazer extrema confusão..
Se cresce do topo da ram para baixo, porque é que é preciso definir um tamanho, e melhor, se é "pequena" dá barraca.
Avr fanboy

Offline dvdt

  • Mini Robot
  • *
  • Mensagens: 1.234
  • David_@@@_Teles
Re: Variáveis locais a escreverem sobre variáveis globais?
« Responder #9 em: 08 de Abril de 2015, 19:26 »
Cuidado com os push's e os pop's da stack ahahah  ;D
David Teles

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.223
    • Clube de Robotica
Re: Variáveis locais a escreverem sobre variáveis globais?
« Responder #10 em: 08 de Abril de 2015, 19:29 »
Define-se tamanho para isso não ir por ai abaixo e começar a editar registos ou funções na RAM  (nem me lembro se isso é acima ou abaixo ;D
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.086
    • Tróniquices
Re: Variáveis locais a escreverem sobre variáveis globais?
« Responder #11 em: 09 de Abril de 2015, 01:27 »
Define-se o tamanho para o compilador saber até onde pode ir o segmento de dados (ou outros).

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.223
    • Clube de Robotica
Re: Variáveis locais a escreverem sobre variáveis globais?
« Responder #12 em: 09 de Abril de 2015, 01:36 »
Achei foi bué estranho ter tipo 512 bytes por default tendo 256KB.

Oh well, é da forma que aprendia mais cedo :D

Estranho foi uma cena... As variáveis globais não deviam tar fora da stack? Eram variáveis declaradas fora de qualquer função num ficheiro à parte.
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

StarRider

  • Visitante
Re: Variáveis locais a escreverem sobre variáveis globais?
« Responder #13 em: 09 de Abril de 2015, 13:08 »
Achei foi bué estranho ter tipo 512 bytes por default tendo 256KB.

Oh well, é da forma que aprendia mais cedo :D

Estranho foi uma cena... As variáveis globais não deviam tar fora da stack? Eram variáveis declaradas fora de qualquer função num ficheiro à parte.

Boas,

256KB de RAM ?  Qual é o MCU ?

Citação de: LuísR.A
Depois no main.c tenho uma variavel local, char a[100] que, apesar de o endereço começar bem atrás, acaba por ir para cima das variáveis globais dentro de library.c

Suponho que quando dizes "main.c" seja fora da função "main", pelo que de CERTEZA que
é uma val global (ainda que _normalmente_ somente visível dentro de main.c), logo não
tem que ser alocado no stack ... deve haver ai qualquer outra confusão.

Posta o source ... promete-mos não copiar nada ;)

Abraços,
PA



StarRider

  • Visitante
Re: Variáveis locais a escreverem sobre variáveis globais?
« Responder #14 em: 09 de Abril de 2015, 13:16 »
Isso das stacks é coisa que me continua a fazer extrema confusão..
Se cresce do topo da ram para baixo, porque é que é preciso definir um tamanho, e melhor, se é "pequena" dá barraca.

Boas,

o "stack" e o "heap" têm que ser quantificados pelo simples facto de que compilador (e/ou
assemblador) necessita dessa informação par evitar corromper os mesmos com os outros
segmentos.

Geralmente este controlo é feito durante a fase de "compile time", mas existem compiladores
que podem gerar código de forma a que esse mesmo controlo seja feita durante a execução
do programa. No que toca ao heap isso é SEMPRE feito em run time.

Abraços,
PA