fabio
08-07-07, 10:50 PM
Folks,
I have been cleaning up some IsoMax code to improve efficiency/speed and seem to have stumbled upon an undocumented limitation. Here is an example. This example is a simple state machine to transmit ASCII codes to a serial 40-character display. The USART port employed had to be a software-created UART port (see Isopod documentation), in this case GPIO PE3.
In the example a contiguous block of memory stores a 40-character string which is loaded in one state transition and then transmitted character-wise in another state transition.
I have found that when the total number of characters to be stored and transmitted is set at 40, then the IsoMax locks up and must be scrubbed. I then made a series of versions which increased from 20 to 40 the total number of characters successively and also queried via SCI0 the TCFAVG and TCFMAX registers. (Actually there were two tiny state machines running in parallel to sense arrival of commands in the SCI1 buffer, and to sweep the ADC registers for display) Here are the results:
ISOPOD V2
ISOMAX V0.82
3 FSMs
Characters TCFMAX TCFAVG
20 4411 1804
30 5642 2282
36 6257 1802
37 6380 1804
38 lockup lockup
Although PERIOD is set to 50000, it appears that the individual state machine cannot consume more than about 6400 ticks, in this case.
QUESTION: Can anyone confirm this apparent FSM tick limitation?
Thanks in advance,
Fabio
( **************************************************************************** )
( **************************************************************************** )
( FOR ILLUSTRATION PURPOSES ONLY )
( NO WARRANTY EXPRESSED OR IMPLIED )
( PORTIONS ADAPTED FROM PUBLIC DOMAIN EXAMPLES )
( **************************************************************************** )
DECIMAL
PE3 IS-TX
9600 PE3 BAUD
( DISPLAY STORAGE UOM IS 16b CHARACTERS )
VARIABLE DISPLAY-STRING ( DISPLAY CHARACTER STRING )
-1 ALLOT ( BACK OUT THE WORD ALLOTTED FOR THE VARIABLE IN RAM )
40 ALLOT ( OPEN A HOLE IN RAM FOR THE STRING )
EEWORD ( MOVE DEFINITION TO EEPROM )
DISPLAY-STRING 40 ERASE ( CLEAN OUT THE HOLE WITH NULS )
( **************************************************************************** )
VARIABLE DCC EEWORD ( DISPLAY CHARACTER COUNT )
( **************************************************************************** )
MACHINE DISPLAY-M EEWORD
ON-MACHINE DISPLAY-M
APPEND-STATE DISPLAY-SEND-STATE EEWORD
( **************************************************************************** )
IN-STATE DISPLAY-SEND-STATE CONDITION PE3 TX? DCC @ 20 < AND
CAUSES
( DISPLAY NEXT CHARACTER OF DISPLAY STRING )
DISPLAY-STRING DCC @ + C@ PE3 TX
DCC 1+!
THEN-STATE DISPLAY-SEND-STATE TO-HAPPEN IN-EE
( **************************************************************************** )
IN-STATE DISPLAY-SEND-STATE CONDITION PE3 TX? DCC @ 20 = AND
CAUSES
0 DCC ! ( MUST RESET DCC AGAIN FOR STATE CONDITIONS )
( ISOLATE EACH NUMERAL IN 16b VALUE VIA DIVISION BY POWERS OF TEN )
( ASSUME FIVE SIGNIFICANT DIGITS PER VARIABLE ADDRESS )
( ADD 48 TO THE NUMERIC VALUE TO SHIFT ASCII CODE INTO NUMERALS )
VAR-ADDR @ 10000 /MOD 48 + DISPLAY-STRING 00 + C!
1000 /MOD 48 + DISPLAY-STRING 01 + C!
100 /MOD 48 + DISPLAY-STRING 02 + C!
10 /MOD 48 + DISPLAY-STRING 03 + C!
@ 48 + DISPLAY-STRING 04 + C!
VAR-ADDR @ 10000 /MOD 48 + DISPLAY-STRING 05 + C!
1000 /MOD 48 + DISPLAY-STRING 06 + C!
100 /MOD 48 + DISPLAY-STRING 07 + C!
10 /MOD 48 + DISPLAY-STRING 08 + C!
@ 48 + DISPLAY-STRING 09 + C!
VAR-ADDR @ 10000 /MOD 48 + DISPLAY-STRING 10 + C!
1000 /MOD 48 + DISPLAY-STRING 11 + C!
100 /MOD 48 + DISPLAY-STRING 12 + C!
10 /MOD 48 + DISPLAY-STRING 13 + C!
@ 48 + DISPLAY-STRING 14 + C!
VAR-ADDR @ 10000 /MOD 48 + DISPLAY-STRING 15 + C!
1000 /MOD 48 + DISPLAY-STRING 16 + C!
100 /MOD 48 + DISPLAY-STRING 17 + C!
10 /MOD 48 + DISPLAY-STRING 18 + C!
@ 48 + DISPLAY-STRING 19 + C!
( CONTINUE TO ADD MORE CHARACTERS AS DESIRED )
THEN-STATE DISPLAY-SEND-STATE TO-HAPPEN IN-EE
( **************************************************************************** )
DISPLAY-SEND-STATE SET-STATE
INSTALL DISPLAY-M
50000 PERIOD ( STANDARD STATE MACHINE CYCLE TIME - SEE TCFTICKS )
( **************************************************************************** )
I have been cleaning up some IsoMax code to improve efficiency/speed and seem to have stumbled upon an undocumented limitation. Here is an example. This example is a simple state machine to transmit ASCII codes to a serial 40-character display. The USART port employed had to be a software-created UART port (see Isopod documentation), in this case GPIO PE3.
In the example a contiguous block of memory stores a 40-character string which is loaded in one state transition and then transmitted character-wise in another state transition.
I have found that when the total number of characters to be stored and transmitted is set at 40, then the IsoMax locks up and must be scrubbed. I then made a series of versions which increased from 20 to 40 the total number of characters successively and also queried via SCI0 the TCFAVG and TCFMAX registers. (Actually there were two tiny state machines running in parallel to sense arrival of commands in the SCI1 buffer, and to sweep the ADC registers for display) Here are the results:
ISOPOD V2
ISOMAX V0.82
3 FSMs
Characters TCFMAX TCFAVG
20 4411 1804
30 5642 2282
36 6257 1802
37 6380 1804
38 lockup lockup
Although PERIOD is set to 50000, it appears that the individual state machine cannot consume more than about 6400 ticks, in this case.
QUESTION: Can anyone confirm this apparent FSM tick limitation?
Thanks in advance,
Fabio
( **************************************************************************** )
( **************************************************************************** )
( FOR ILLUSTRATION PURPOSES ONLY )
( NO WARRANTY EXPRESSED OR IMPLIED )
( PORTIONS ADAPTED FROM PUBLIC DOMAIN EXAMPLES )
( **************************************************************************** )
DECIMAL
PE3 IS-TX
9600 PE3 BAUD
( DISPLAY STORAGE UOM IS 16b CHARACTERS )
VARIABLE DISPLAY-STRING ( DISPLAY CHARACTER STRING )
-1 ALLOT ( BACK OUT THE WORD ALLOTTED FOR THE VARIABLE IN RAM )
40 ALLOT ( OPEN A HOLE IN RAM FOR THE STRING )
EEWORD ( MOVE DEFINITION TO EEPROM )
DISPLAY-STRING 40 ERASE ( CLEAN OUT THE HOLE WITH NULS )
( **************************************************************************** )
VARIABLE DCC EEWORD ( DISPLAY CHARACTER COUNT )
( **************************************************************************** )
MACHINE DISPLAY-M EEWORD
ON-MACHINE DISPLAY-M
APPEND-STATE DISPLAY-SEND-STATE EEWORD
( **************************************************************************** )
IN-STATE DISPLAY-SEND-STATE CONDITION PE3 TX? DCC @ 20 < AND
CAUSES
( DISPLAY NEXT CHARACTER OF DISPLAY STRING )
DISPLAY-STRING DCC @ + C@ PE3 TX
DCC 1+!
THEN-STATE DISPLAY-SEND-STATE TO-HAPPEN IN-EE
( **************************************************************************** )
IN-STATE DISPLAY-SEND-STATE CONDITION PE3 TX? DCC @ 20 = AND
CAUSES
0 DCC ! ( MUST RESET DCC AGAIN FOR STATE CONDITIONS )
( ISOLATE EACH NUMERAL IN 16b VALUE VIA DIVISION BY POWERS OF TEN )
( ASSUME FIVE SIGNIFICANT DIGITS PER VARIABLE ADDRESS )
( ADD 48 TO THE NUMERIC VALUE TO SHIFT ASCII CODE INTO NUMERALS )
VAR-ADDR @ 10000 /MOD 48 + DISPLAY-STRING 00 + C!
1000 /MOD 48 + DISPLAY-STRING 01 + C!
100 /MOD 48 + DISPLAY-STRING 02 + C!
10 /MOD 48 + DISPLAY-STRING 03 + C!
@ 48 + DISPLAY-STRING 04 + C!
VAR-ADDR @ 10000 /MOD 48 + DISPLAY-STRING 05 + C!
1000 /MOD 48 + DISPLAY-STRING 06 + C!
100 /MOD 48 + DISPLAY-STRING 07 + C!
10 /MOD 48 + DISPLAY-STRING 08 + C!
@ 48 + DISPLAY-STRING 09 + C!
VAR-ADDR @ 10000 /MOD 48 + DISPLAY-STRING 10 + C!
1000 /MOD 48 + DISPLAY-STRING 11 + C!
100 /MOD 48 + DISPLAY-STRING 12 + C!
10 /MOD 48 + DISPLAY-STRING 13 + C!
@ 48 + DISPLAY-STRING 14 + C!
VAR-ADDR @ 10000 /MOD 48 + DISPLAY-STRING 15 + C!
1000 /MOD 48 + DISPLAY-STRING 16 + C!
100 /MOD 48 + DISPLAY-STRING 17 + C!
10 /MOD 48 + DISPLAY-STRING 18 + C!
@ 48 + DISPLAY-STRING 19 + C!
( CONTINUE TO ADD MORE CHARACTERS AS DESIRED )
THEN-STATE DISPLAY-SEND-STATE TO-HAPPEN IN-EE
( **************************************************************************** )
DISPLAY-SEND-STATE SET-STATE
INSTALL DISPLAY-M
50000 PERIOD ( STANDARD STATE MACHINE CYCLE TIME - SEE TCFTICKS )
( **************************************************************************** )