Difference between revisions of "Embedded System Tutorial File I/O"

From Embedded Systems Learning Academy
Jump to: navigation, search
(Assignment)
(Assignment)
Line 5: Line 5:
  
 
#  Create a '''<code>producer task</code>''' that takes 1 light sensor value every 1ms.
 
#  Create a '''<code>producer task</code>''' that takes 1 light sensor value every 1ms.
#: Collect the average of the 100 readings.
+
#* Collect the average of the 100 readings.
#: Write average value of 100ms (100 samples) to the '''<code>sensor queue</code>'''.
+
#* Write average value of 100ms (100 samples) to the '''<code>sensor queue</code>'''.
#: Use medium priority for this task
+
#* Use medium priority for this task
 
#  Create a '''<code>consumer task</code>''' that pulls the data off the '''<code>sensor queue</code>'''  
 
#  Create a '''<code>consumer task</code>''' that pulls the data off the '''<code>sensor queue</code>'''  
#: Use infinite timeout value during queue receive API
+
#* Use infinite timeout value during queue receive API
#: Open a file (sensor.txt), and append the data to an output file on the SD card.
+
#* Open a file (sensor.txt), and append the data to an output file on the SD card.
#: Save the data in this format: '''<code>printf("%i, %i\n", time, light)"</code>'''
+
#* Save the data in this format: '''<code>printf("%i, %i\n", time, light)"</code>'''
#: Just leave the file in "open" mode, such that it will flush the data after enough data is written rather than flushing it upon each write, which will consume a lot of CPU.
+
#* Just leave the file in "open" mode, such that it will flush the data after enough data is written rather than flushing it upon each write, which will consume a lot of CPU.
#: Use medium priority for this task
+
#* Use medium priority for this task
 
#  Create a '''<code>watchdog task</code>''' that monitors the operation of the two tasks.
 
#  Create a '''<code>watchdog task</code>''' that monitors the operation of the two tasks.
#: Use high priority for this task.
+
#* Use high priority for this task.
#: Every sixty seconds, save the CPU usage info to a file named "cpu.txt".  See terminal command "infoHandler" for reference.  Open the file, write the file, and close it immediately so the data is immediately flushed.
+
#* Every sixty seconds, save the CPU usage info to a file named "cpu.txt".  See terminal command "infoHandler" for reference.  Open the file, write the file, and close it immediately so the data is immediately flushed.
#: Towards the end of the other tasks, set a bit using the '''<code>xEventGroupSetBits()</code>'''
+
#* Towards the end of the other tasks, set a bit using the '''<code>xEventGroupSetBits()</code>'''
#: Task 1 should set bit1, Task 2 should set bit2 etc.
+
#* Task 1 should set bit1, Task 2 should set bit2 etc.
#: Use a timeout of 1 second, and wait for all the bits to set.  If there are two tasks, wait for bit1, and bit2 etc.
+
#* Use a timeout of 1 second, and wait for all the bits to set.  If there are two tasks, wait for bit1, and bit2 etc.
#: If you fail to detect the bits are set, that means that the other tasks did not reach the end of the loop.
+
#* If you fail to detect the bits are set, that means that the other tasks did not reach the end of the loop.
#: In the event of failed to detect the bits, append a file (stuck.txt) with the information about which task may be "stuck"
+
#* In the event of failed to detect the bits, append a file (stuck.txt) with the information about which task may be "stuck"
#: Open the file, append the data, and close the (stuck.txt) file to flush out the data immediately.
+
#* Open the file, append the data, and close the (stuck.txt) file to flush out the data immediately.
 
#  Create a terminal command to "suspend" and "resume" a task by name.
 
#  Create a terminal command to "suspend" and "resume" a task by name.
#: "task suspend task1" should suspend a task named "task1"
+
#* "task suspend task1" should suspend a task named "task1"
#: "task resume task2" should suspend a task named "task2"
+
#* "task resume task2" should suspend a task named "task2"
 
#  Run the system, and under normal operation, you will see a file being saved with sensor data values.
 
#  Run the system, and under normal operation, you will see a file being saved with sensor data values.
#: Plot the file data in Excel to demonstrate.
+
#* Plot the file data in Excel to demonstrate.
 
#  Suspend the producer task.  The watchdog task should display a message and save relevant info to the SD card.
 
#  Suspend the producer task.  The watchdog task should display a message and save relevant info to the SD card.
 
#  Let the system run for a while, and note down the CPU usage in your text file.
 
#  Let the system run for a while, and note down the CPU usage in your text file.
 
#  Change the ADC sensor implementation
 
#  Change the ADC sensor implementation
#: Modify the source code of how the light sensor class obtains the ADC value by not using ADC polling mode.
+
#* Modify the source code of how the light sensor class obtains the ADC value by not using ADC polling mode.
#: Instead of "trigger ADC", "wait for completion", and "read value", modify it to this:
+
#* Instead of "trigger ADC", "wait for completion", and "read value", modify it to this:
#::  Upon ADC initialization, enable ADC interrupt, which should "give" a semaphore.
+
#*:  Upon ADC initialization, enable ADC interrupt, which should "give" a semaphore.
#::  After triggering the ADC, wait for ADC semaphore to be given, and then read the value.
+
#*:  After triggering the ADC, wait for ADC semaphore to be given, and then read the value.
 
#  After changing the ADC behavior, let the system run for a while, and note down the CPU usage again.
 
#  After changing the ADC behavior, let the system run for a while, and note down the CPU usage again.
  

Revision as of 00:59, 10 May 2014

In this project, we will attempt to "combine" all the FreeRTOS knowledge into a single assignment.

Assignment

Please follow the steps precisely in order to complete the objectives of the assignment. If you use the C++ FreeRTOS framework, it should make the assignment significantly easy.

  1. Create a producer task that takes 1 light sensor value every 1ms.
    • Collect the average of the 100 readings.
    • Write average value of 100ms (100 samples) to the sensor queue.
    • Use medium priority for this task
  2. Create a consumer task that pulls the data off the sensor queue
    • Use infinite timeout value during queue receive API
    • Open a file (sensor.txt), and append the data to an output file on the SD card.
    • Save the data in this format: printf("%i, %i\n", time, light)"
    • Just leave the file in "open" mode, such that it will flush the data after enough data is written rather than flushing it upon each write, which will consume a lot of CPU.
    • Use medium priority for this task
  3. Create a watchdog task that monitors the operation of the two tasks.
    • Use high priority for this task.
    • Every sixty seconds, save the CPU usage info to a file named "cpu.txt". See terminal command "infoHandler" for reference. Open the file, write the file, and close it immediately so the data is immediately flushed.
    • Towards the end of the other tasks, set a bit using the xEventGroupSetBits()
    • Task 1 should set bit1, Task 2 should set bit2 etc.
    • Use a timeout of 1 second, and wait for all the bits to set. If there are two tasks, wait for bit1, and bit2 etc.
    • If you fail to detect the bits are set, that means that the other tasks did not reach the end of the loop.
    • In the event of failed to detect the bits, append a file (stuck.txt) with the information about which task may be "stuck"
    • Open the file, append the data, and close the (stuck.txt) file to flush out the data immediately.
  4. Create a terminal command to "suspend" and "resume" a task by name.
    • "task suspend task1" should suspend a task named "task1"
    • "task resume task2" should suspend a task named "task2"
  5. Run the system, and under normal operation, you will see a file being saved with sensor data values.
    • Plot the file data in Excel to demonstrate.
  6. Suspend the producer task. The watchdog task should display a message and save relevant info to the SD card.
  7. Let the system run for a while, and note down the CPU usage in your text file.
  8. Change the ADC sensor implementation
    • Modify the source code of how the light sensor class obtains the ADC value by not using ADC polling mode.
    • Instead of "trigger ADC", "wait for completion", and "read value", modify it to this:
      Upon ADC initialization, enable ADC interrupt, which should "give" a semaphore.
      After triggering the ADC, wait for ADC semaphore to be given, and then read the value.
  9. After changing the ADC behavior, let the system run for a while, and note down the CPU usage again.

What you created is a "software watchdog". This means that in an event when a loop is stuck, or a task is frozen, you can save relevant information such that you can debug at a later time.

After completing the assignment, you will get a sensor of how the CPU is utilized, and how to use a new FreeRTOS event group API. All together, you should acheive a better sensor of designing your tasks and using the File I/O for debugging purposes.