collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

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

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

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • 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.753
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.224
    • 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.224
    • 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.733
  • 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.224
    • 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.733
  • 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.224
    • 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.733
  • 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.248
  • David Teles
    • Site Pessoal
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
Engenharia Electrotécnica e Computadores (IST)
Analyst in a Big 4

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • 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.598
    • 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.224
    • 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