How about this then?

int putchar(int character)
{
        void uart_a1_send_char(uint8_t character)
        {
                uint8_t should_enable = 0;
                if(__read_status_register() & GIE)
                {
                        should_enable = 1;
                        __dint();
                }
                
                while(! (UC1IFG & UCA1TXIFG));
                UC1IFG &= ~UCA1TXIFG;
                UCA1TXBUF = character;
                if(should_enable)
                        __eint();
        }
}

Although I feel it a little cluttered for it to run on every single character 
of every string printf'ed. If I just make sure not to call it from an 
interrupt, I guess it is unnecessary 
---------------------------------------
Sergio Campamá
sergiocamp...@gmail.com




On Nov 16, 2011, at 8:29 PM, Crazy Casta wrote:

> If you want to use taht putchar in interrupts you had better save the
> interrupt bit before dint and only eint if the interrupt bit was set before.
> 
> Based on the symptoms you have just described I would check the UCA0
> interrupt bits. It is likely that you have a TX empty interrupt that is
> getting triggered and either crashing or simply not clearing the TX IFG.
> 
> On Wed, Nov 16, 2011 at 10:35 AM, Sergio Campamá <scamp...@ing.puc.cl>wrote:
> 
>> Ok, I got it working now...
>> 
>> With the interrupt disable/enable in putchar, as in the following code, the
>> app never crashes
>> 
>> __dint();
>>   while(! (UC0IFG & UCA0TXIFG));
>>   UCA0TXBUF = character;
>>   UC0IFG &= ~UCA0TXIFG;
>>   __eint();
>> 
>> I think with this, printf CAN be called from interrupts...  Looking at the
>> generated assembly, this only adds 3 instructions in total, eint, dint and
>> a nop...
>> 
>> On Tue, Nov 15, 2011 at 4:43 PM, Sergio Campamá <scamp...@ing.puc.cl>
>> wrote:
>> 
>>>> 
>>>> Am 15.11.2011 00:30, schrieb Sergio Campamá:
>>>>> The weird thing is I have like 8kb of RAM, but the firmware crashes on
>>>>> printf statements. msp430-size tells me that data+bss is 2666, so I
>>> believe
>>>>> I have enough RAM.
>>>> 
>>>> good.
>>>> 
>>>> the output goes directly to the serial port or to a buffer? if it is a
>>>> buffer, is there a size check?
>>>> 
>>> 
>>> The output is direct, no buffers.
>>> 
>>>>> We're using Z1 nodes, and the JTAG connector is somewhat complex to
>>> access
>>>>> (they charge 16 bucks for every connector, Im looking to make one
>> myself
>>>>> right now) so access to the PC to see where it stopped is limited as
>> of
>>>>> now. The app works properly and never crashes if we dont use printf,
>> so
>>> I
>>>>> dont know what could be happening..
>>>> 
>>>> memory usage and timing issues are the first things i'd look at.
>>>> 
>>> 
>>> As soon as I get JTAG access I'll look into that
>>> 
>>>>> Although, I am using TimerA to generate 1 ms interrupts using the
>>> external
>>>>> 32768 crystal to keep an internal clock... is printf friendly with
>> such
>>>>> kind (rapid) of interrupts?
>>>> 
>>>> the interrupt handlers are short and not using printf?
>>>> 
>>>> using printf from interrupts may cause problems, as printf takes a lot
>>>> of CPU cycles (and stack memory).
>>>> 
>>>> older printf implementations are also not reentrant (the latest is, but
>>>> your putchar may not be).
>>>> 
>>> 
>>> no, I don't call printf from interrupts...
>>> 
>>>>> Another related question. What really happens when the memory gets
>>>>> overwritten?
>>>> 
>>>> a typical problem is when the stack overlays variables and the
>> variables
>>>> are altered. so they alter memory that currently is also used as stack
>>>> and therefore it may corrupt return addresses. similarly such a deep
>>>> stack could also overwrite function pointer variables.
>>>> 
>>>> an other common error is a buffer or array in the middle of all other
>>>> variables that gets overrun. so variables before or after that buffer
>>>> get overwritten.
>>>> 
>>> 
>>> Is there any technique to check the status of ram? as in a full dump?
>>> 
>>> 
>>>>> Why does the msp430 crashes instead of going back to the start
>>>>> of the program? Does the PC get stuck? Does it generate an
>> interruption?
>>>> 
>>>> There are a few cases:
>>>> a) PC is offset and executing invalid or not the intended instructions.
>>>> b) PC points to other memory e.g. peripherals, RAM not containing code.
>>>>  see case a)
>>>> c) "bis.w LPMx, SR" is accidentally executing, putting the CPU to
>> sleep.
>>>>  higher LPM modes also stop other clocks.
>>>> d) interrupts occurring at a faster rate than the processing takes
>>>> e) not clearing the interrupt flag (IFG) -> interrupt is constantly
>>>>  restarted
>>>> f) using EINT in interrupt handlers -> nested interrupts are possible
>>>>  which may use a lot of stack memory -> overwrites
>>>> g) recursive function calls -> stack -> overwrites similar to f).
>>>> ...
>>>> 
>>>> newer MSP430 series detect some of the conditions above (e.g.
>>>> instruction fetch in peripheral area, invalid instructions) and reset.
>>>> but usually it just keeps executing.
>>>> an other common way to recover is using the hardware watchdog (WDT).
>>>> 
>>>> when the CPU is executing "random" instructions a lot of other things
>>>> may happen, such as reconfiguring ports and peripherals.
>>>> 
>>>> 
>>>> but it's not always that complicated, sometimes it's just loops with
>>>> wrong exit conditions ;-) or a printf of a string (char *) that that
>>>> points to some other place than intended. and then it keeps printing
>>>> hundreds of bytes until a string terminating zero byte is hit.
>>>> 
>>>> also to consider are race conditions or waiting for events that never
>>>> happen or occurred faster than expected. e.g.
>>>> - polling for a hardware condition when the peripheral is stopped
>>>> - interrupt handlers and foreground functions accessing the same
>>>> complex data at the same time without appropriate protection
>>>> (leading to inconsistent data)
>>>> - clearing and then waiting for a flag from the hardware (e.g. IFGs)
>>>> but the hardware already had set the flag before it was cleared.
>>>> - setting up a compare with the timer to a time that is already passed
>>>> (the timer interrupt will be one timer round later than expected)
>>>> - ...
>>>> these are not crashes but may lead to unexpected behavior.
>>>> 
>>> 
>>> I'll check on these suggestions… But I can't really see it until I get my
>>> hands on JTAG…
>>> 
>>> Thanks!!
>>> 
>>> 
>>>> chris
>>>> 
>>>> 
>>> 
>> ------------------------------------------------------------------------------
>>>> RSA(R) Conference 2012
>>>> Save $700 by Nov 18
>>>> Register now
>>>> http://p.sf.net/sfu/rsa-sfdev2dev1
>>>> _______________________________________________
>>>> Mspgcc-users mailing list
>>>> Mspgcc-users@lists.sourceforge.net
>>>> https://lists.sourceforge.net/lists/listinfo/mspgcc-users
>>> 
>>> 
>> 
>> 
>> ------------------------------------------------------------------------------
>> All the data continuously generated in your IT infrastructure
>> contains a definitive record of customers, application performance,
>> security threats, fraudulent activity, and more. Splunk takes this
>> data and makes sense of it. IT sense. And common sense.
>> http://p.sf.net/sfu/splunk-novd2d
>> _______________________________________________
>> Mspgcc-users mailing list
>> Mspgcc-users@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/mspgcc-users
>> 
>> 
> ------------------------------------------------------------------------------
> All the data continuously generated in your IT infrastructure 
> contains a definitive record of customers, application performance, 
> security threats, fraudulent activity, and more. Splunk takes this 
> data and makes sense of it. IT sense. And common sense.
> http://p.sf.net/sfu/splunk-novd2d_______________________________________________
> Mspgcc-users mailing list
> Mspgcc-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/mspgcc-users


------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure 
contains a definitive record of customers, application performance, 
security threats, fraudulent activity, and more. Splunk takes this 
data and makes sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-novd2d
_______________________________________________
Mspgcc-users mailing list
Mspgcc-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mspgcc-users

Reply via email to