[Solved] PROG1970 Assignment 2- EncodeInput Utility

$25

File Name: PROG1970_Assignment_2-_EncodeInput_Utility.zip
File Size: 395.64 KB

SKU: [Solved] PROG1970 Assignment 2- EncodeInput Utility Category: Tag:
5/5 - (1 vote)

This assignment has you writing a different utility for Linux. This utility (officially called a filter in UNIX / Linux) could be used to take an assembled program (e.g. for the Motorola 6808 Microcontroller) and generate something known as an S19 download file in order to download the assembled code to the actual embedded device. This is similar to your ARM development environment in the MES course you write and compile your code on a host computer and download it to the ARM board

This application will encourage you to learn more about the common application-programming model in UNIX / Linux. The utility (or filter) that you create will take ANY binary input file, and transform it into its equivalent S-Record output file, OR an assembly file for use in an embedded software development environment. The two different output file formats which are generated by this filter will both be ASCII (human readable).

Objectives

  • Reinforce knowledge of binary arithmetic and the hexadecimal numbering system
  • Reinforce knowledge of File I/O (both ASCII and binary) in programming using actual files as well as STDIN and STDOUT
  • Practice writing a utility that can use command-shell redirecting and/or piping
  • Practice writing a utility that requires and uses command-line arguments

Background

The S-RECORD Output of your encodeInput Filter

S-Records are often used in embedded development environments in terms of transferring data from one system to another. Development tools like EPROM burners for example accept data in this format. As you may recall from DEF, an ASM file (assembly file) is used by embedded development tools to allow you to specify both machine codes and data (like strings) for your target system.

The Motorola SRecord File format was developed a number of years ago. It is also known as the SREC or S19 format. It was developed in the 1970s by Motorola (for the 6800 microprocessor) to allow you to encode your binary files (e.g. your executables) into an ASCII format file for easy downloading to an embedded system. Visit the link above to learn more about the structure of the S-Record.

Example:

Input data:

ABCDEFGHIJKLMNOPQRST

SREC Output data:

S00700005345414ED1

S11300004142434445464748494A4B4C4D4E4F5064

S1070010515253549E

S5030002FA

S9030000FC

As you can see, the S19 (or SREC) file is made up of a number of S type records (S0, S1, S5 and S9 in the above example).

The general format of each of these S records is:

TTCCAAAADDD .. DDMM

Where TT 2 characters indicating the S-Record type

CC 2 characters representing a single hexadecimal byte telling how many hexadecimal coded bytes follow in that line AAAA 4 characters representing a hexadecimal address where the data on this S-record line needs to be loaded into memory on the embedded device

DD..DD up to 32 characters representing up to 16 hexadecimal byte values representing the input data

MM 2 characters representing a single hexadecimal value which acts as the checksum value for that S Record

Things to Note

  • The COUNT field (CC) of the specific S Record contains the number of bytes including the address field (AAAA), the data fields (DD..DD) and the checksum field (MM)
  • In our filter we will only be using 4 character address fields (representing a 2 hexadecimal byte address) this means you only need to use the S1 record for your data.
    • Since each S1 record is limited to containing a maximum of 16 bytes worth of data this means that the address value contained in this field will always increment by 16
    • This means that each S1 record will only represent 16 bytes worth of encode data. So if the assembled program that you are trying to encode for downloading is 40 bytes in length then your resultant file will contain two S1 records representing 16 bytes of data each and one S1 record containing the remaining 8 bytes of data (16+16+8=40)
  • The CHECKSUM field (MM) value is calculated by taking the least significant byte of the 1s Complement value of the sum of the COUNT, ADDRESS and DATA fields of the record o To calculate this value add the COUNT fields value with the ADDRESS fields value with each of the DATA fields values to get a sum value o Then take the 1s Complement (remember DEF) of this sum
    • Then strip off the value in the least significant byte of the resultant value and encode it
  • One thing that will strike you as odd about the above coding and sample is for example how I say that the COUNT field is 2 characters in output, but represents a single hexadecimal byte o For example the above COUNT field is set to 13 which represents the hex number 0x13 (19 decimal)
    • You will remember from DEF that a value of 0x13 hex could definitely be stored in a single byte of output so why then does the resultant

S Record output use 2 bytes to store it it stores the character 1 in one output byte and the character 3 in another byte o This is a form of hexadecimal coded values that the S Record file uses remember that the S Record out is always human readable

  • If the output actually stored the value 0x13 in a single byte the file wouldnt be readable check out the ASCII table
  • 19 decimal in the ASCII table is known as a character called device control 3 (DC3) which is unprintable / unreadable by a human o So the hexadecimal encoding that is really happening within this utility is:
  • If the value that needs to be output would end up being 0xA4 as a hexadecimal value then the output will contain A4 (ASCII code 65 followed by ASCII code 52) instead
  • if the value 9 hexadecimal needs to be output by the program, then the output will contain 09 (ASCII code 48 followed by ASCII code 57)
  • as you can see each single hexadecimal byte value is translated (encoded) as 2 ASCII output characters
  • The S0 record is known as the header record of the output file o In this utility, I want you to encode your first name in the DATA field of the S0 record

▪ e.g. the data fields in the above example 5345414E actually spells SEAN 5316=8310=ASCII code for S

  • The S5 record is found immediately after the last S1 record serves as summation record within the output file o The AAAA (address field) of this record represents the total number of S1 records that preceded this record in the out
  • The S9 record is the trailer record in the output file o The AAAA (address field) of this record represents the address in memory on the target embedded device where the program actually starts

The ASSEMBLY FILE Output of your encodeInput Filter

The required Assembly File format that your utility can also produce is much more straightforward in its coding than the S-Record format. Essentially, this format translates each byte of input data into a define constant byte (dc.b) assembly instruction. Each line of the resultant file is allowed to contain a maximum of 16 bytes of input data.

Example:

Input data:

ABCDEFGHIJKLMNOPQRST

Assembly File Output data:

dc.b $41, $42, $43, $44, $45, $46, $47, $48, $49, $4A, $4B, $4C, $4D, $4E, $4F, $50

dc.b $51, $52, $53, $54

Your Task

Create a C program that has 4 optional switches (in C, you might consider these as command line arguments). With the exception of the help switch, your filter program (called encodeInput) will take and interpret input as binary values, and produce ASCII readable output based on these switches. The data values encoded in the output will always be the hexadecimal representation of the ASCII value of the input byte.

The switches that encodeInput must support are:

  • -iINPUTFILENAME o This option tells your software the name of the input file. o If this file is not specified, your program will obtain input data from the standard input (stdin file handle) o If the file is specified and does not exist, your program will present an error
  • -oOUTPUTFILENAME
    • This option tells your software the name of the output file.
    • If this file is not specified, and an input file is specified
      • If the srec option is not present, then the output filename will be the input filename, with .asm file extension appended
      • g. encodeInput iBinary-01.bin will automatically create an output file called Binary-01.bin.asm
      • If the srec option is present, then the output filename will be the input filename, with .srec appended
      • g. encodeInput srec iBinary-01.bin will automatically create an output file called Binary-01.bin.srec
      • Notice in this assignment, we are not replacing the input files extension we are simply appending the output files extension
    • If this file is not specified and no input file is specified, then all output will be sent to the standard output (stdout file handle) o If this file is specified and for some reason, it cannot be open for writing purposes, the filter will produce an error
  • -srec o This option tells your software to output in the S-Record format
    • Without this option specified on the command line, then an Assembly File output will result
  • -h o This option will cause the program to output help information (or usage statement) and exit o The usage statement is simply the name of the program and its allowable runtime switches

If any other (invalid) switches are present on the command line, the filter will display the usage statement and exit.

Because encodeInput uses run-time switches, this program does not need to prompt the end user for any other kinds of input. Instead, if written correctly, the end user will be able to redirect or pipe textual data into the application in place of using a file!

Although it probably doesnt need to be said the only way that encodeInput should allow an input stream to end is when it reaches the end-of-file. That is, if you are running encodeInput and reading from a file, obviously the input ends when it reaches the end-of-file. Similarly when you are running the utility interactively and are entering input via the keyboard, the input ends when it reaches the end-of-file not an ENTER key, and not any other special character sequence just an end-of-file. What you need to do is to simulate an end-of-file from the keyboard this is done by entering a CTRL-D (pressing the CONTROL key and the D key simultaneously).

Please note that CTRL-D only works to end the file when entered at the beginning of the input line if it is not the first character of the input, then CTRLD serves to flush (or push) the data ahead of it into the program. For example, assume the D in the following examples represents when I press CTRL-D and E is when I hit enter so if you enter 123D, the CTRL-D simply causes the program to read 123. But if my input is 123ED then the CTRL-D is the first character of an input line (because it follows an ENTER) so this will be interpreted as an EOF character in your program.

Some examples of valid command lines:

encodeInput -imyData.dat -omyData.srec -srec

  • The above will convert dat to myData.srec as an S-Record file

encodeInput -h

  • The above will output help (usage statement) information and exit

encodeInput -omyData.asm

  • The above will convert standard input into asm as an assembly file

encodeInput srec -imyData.dat

  • The above will convert data from dat into myData.dat.srec as an S-Record file

encodeInput

  • The above will convert standard input into Assembly formatted standard output

ls -l | encodeInput -odirectory.srec -srec

  • The above will take the piped standard input from ls -l command and format as an S-Record file output in srec

NOTE: The runtime switches can appear in any order on the command line

OTHER PROGRAMMING NOTES:

  • It is expected that your final solution and source code for this utility consists of at least 3 source modules and at least one header file o As before I am asking you to do this to start you thinking about designing your solutions to properly modularize your solution approach into different source code modules (files)
  • Remember that it is good design practice to not place any problem-domain knowledge in the main() function
  • Also it is good design practice to not place any of your solutions functions in the same source module as the main() function
  • You must comply with SET Coding Standards o Make sure to comment your source code appropriately this includes file header comments, function header comments as well as inline comments
  • Your solution structure must include a makefile and also follow the recommended Linux development directory structure as outlined in the LinuxDevelopment-Project-Code-Structure document within eConestoga

Hand in

Reviews

There are no reviews yet.

Only logged in customers who have purchased this product may leave a review.

Shopping Cart
[Solved] PROG1970 Assignment 2- EncodeInput Utility
$25