• Welcome to LusoRobótica - Robótica em Português.
 

Variáveis locais a escreverem sobre variáveis globais?

Started by LuísR.A., 08 de April de 2015, 19:01

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

LuísR.A.

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/

metRo_

Quote from: LuísR.A. on 08 de April 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?

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

LuísR.A.

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/

LuísR.A.

Nope. O .map diz que sobra 254816 bytes e sei que as locais não ultrapassam isso :/


Quote from: metRo_ on 08 de April de 2015, 19:03



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.
Tiva MCU é que é.

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

senso

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

LuísR.A.

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/

senso

Avr fanboy

LuísR.A.

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/

senso

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

dvdt

Engenharia Electrotécnica e Computadores (IST)
Analyst in a Big 4

LuísR.A.

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/

Njay

Define-se o tamanho para o compilador saber até onde pode ir o segmento de dados (ou outros).

LuísR.A.

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

Quote from: LuísR.A. on 09 de April 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.

Boas,

256KB de RAM ?  Qual é o MCU ?

Quote from: 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

Quote from: senso on 08 de April 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.

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