[修改] 增加freeRTOS

1. 版本FreeRTOSv202212.01,命名为kernel;
This commit is contained in:
2023-05-06 16:43:01 +00:00
commit a345df017b
20944 changed files with 11094377 additions and 0 deletions

View File

@ -0,0 +1,30 @@
CC ?= gcc
export BUILD_DIR ?= ./build
export SRC_DIR ?= ./src
export TEST_DIR ?= ./test
export TEST_BUILD_DIR ?= ${BUILD_DIR}/test
TEST_MAKEFILE = ${TEST_BUILD_DIR}/MakefileTestSupport
OBJ ?= ${BUILD_DIR}/obj
OBJ_DIR = ${OBJ}
default: all
all: setup test ${BUILD_DIR}/main run
setup:
mkdir -p ${BUILD_DIR}
mkdir -p ${OBJ}
ruby ../../scripts/create_makefile.rb --silent
clean:
rm -rf ${BUILD_DIR}
${BUILD_DIR}/main: ${SRC_DIR}/main.c ${SRC_DIR}/foo.c
${CC} $< -o $@
run:
./build/main || true
test: setup
-include ${TEST_MAKEFILE}

View File

@ -0,0 +1,5 @@
#include "foo.h"
void foo_init(void)
{
}

View File

@ -0,0 +1,5 @@
#ifndef _foo_h
void foo_init(void);
#endif

View File

@ -0,0 +1,15 @@
#include <stdio.h>
#include "foo.h"
int real_main(int argc, char ** argv)
{
printf("Hello world!\n");
return 0;
}
#ifndef TEST
int main(int argc, char ** argv)
{
return real_main(argc, argv);
}
#endif

View File

@ -0,0 +1,17 @@
#include "unity.h"
#include "foo.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void test_foo_init_should_initialize_multiplier()
{
foo_init();
TEST_ASSERT_FALSE(1);
}

View File

@ -0,0 +1,15 @@
#include "unity.h"
#include "mock_foo.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void test_main_should_initialize_foo(void)
{
TEST_IGNORE_MESSAGE("TODO: Implement main!");
}

View File

@ -0,0 +1,44 @@
compiler:
path: gcc
source_path: 'src/'
unit_tests_path: &unit_tests_path 'test/'
build_path: &build_path 'build/'
options:
- -c
includes:
prefix: '-I'
items:
- 'src/'
- '../../src/'
- '../../vendor/unity/src/'
- '../../vendor/unity/examples/example_3/helper/'
- './build/mocks/'
- *unit_tests_path
defines:
prefix: '-D'
items:
- __monitor
object_files:
prefix: '-o'
extension: '.o'
destination: *build_path
linker:
path: gcc
options:
- -lm
includes:
prefix: '-I'
object_files:
path: *build_path
extension: '.o'
bin_files:
prefix: '-o'
extension: '.exe'
destination: *build_path
:cmock:
:plugins: []
:includes:
- Types.h
:mock_path: ./build/mocks
colour: true

View File

@ -0,0 +1,92 @@
tools_root: &tools_root 'C:\Program Files\IAR Systems\Embedded Workbench 4.0 Kickstart\'
compiler:
path: [*tools_root, 'arm\bin\iccarm.exe']
source_path: 'src\'
unit_tests_path: &unit_tests_path 'test\'
build_path: &build_path 'build\'
options:
- --dlib_config
- [*tools_root, 'arm\lib\dl4tptinl8n.h']
- -z3
- --no_cse
- --no_unroll
- --no_inline
- --no_code_motion
- --no_tbaa
- --no_clustering
- --no_scheduling
- --debug
- --cpu_mode thumb
- --endian little
- --cpu ARM7TDMI
- --stack_align 4
- --interwork
- -e
- --silent
- --warnings_are_errors
- --fpu None
- --diag_suppress Pa050
includes:
prefix: '-I'
items:
- 'src/'
- '../../src/'
- '../../vendor/unity/src/'
- '../../vendor/unity/examples/example_3/helper/'
- './build/mocks/'
- [*tools_root, 'arm\inc\']
- *unit_tests_path
defines:
prefix: '-D'
items:
object_files:
prefix: '-o'
extension: '.r79'
destination: *build_path
linker:
path: [*tools_root, 'common\bin\xlink.exe']
options:
- -rt
- [*tools_root, 'arm\lib\dl4tptinl8n.r79']
- -D_L_EXTMEM_START=0
- -D_L_EXTMEM_SIZE=0
- -D_L_HEAP_SIZE=120
- -D_L_STACK_SIZE=32
- -e_small_write=_formatted_write
- -s
- __program_start
- -f
- [*tools_root, '\arm\config\lnkarm.xcl']
includes:
prefix: '-I'
items:
- [*tools_root, 'arm\config\']
- [*tools_root, 'arm\lib\']
object_files:
path: *build_path
extension: '.r79'
bin_files:
prefix: '-o'
extension: '.d79'
destination: *build_path
simulator:
path: [*tools_root, 'common\bin\CSpyBat.exe']
pre_support:
- --silent
- [*tools_root, 'arm\bin\armproc.dll']
- [*tools_root, 'arm\bin\armsim.dll']
post_support:
- --plugin
- [*tools_root, 'arm\bin\armbat.dll']
- --backend
- -B
- -p
- [*tools_root, 'arm\config\ioat91sam7X256.ddf']
- -d
- sim
:cmock:
:plugins: []
:includes:
- Types.h
:mock_path: ./build/mocks

View File

@ -0,0 +1,81 @@
tools_root: &tools_root 'C:\Program Files\IAR Systems\Embedded Workbench 5.3\'
compiler:
path: [*tools_root, 'arm\bin\iccarm.exe']
source_path: 'src\'
unit_tests_path: &unit_tests_path 'test\'
build_path: &build_path 'build\'
options:
- --dlib_config
- [*tools_root, 'arm\inc\DLib_Config_Normal.h']
- --no_cse
- --no_unroll
- --no_inline
- --no_code_motion
- --no_tbaa
- --no_clustering
- --no_scheduling
- --debug
- --cpu_mode thumb
- --endian=little
- --cpu=ARM7TDMI
- --interwork
- --warnings_are_errors
- --fpu=None
- --diag_suppress=Pa050
- --diag_suppress=Pe111
- -e
- -On
includes:
prefix: '-I'
items:
- 'src/'
- '../../src/'
- '../../vendor/unity/src/'
- '../../vendor/unity/examples/example_3/helper/'
- './build/mocks/'
- [*tools_root, 'arm\inc\']
- *unit_tests_path
defines:
prefix: '-D'
items:
object_files:
prefix: '-o'
extension: '.r79'
destination: *build_path
linker:
path: [*tools_root, 'arm\bin\ilinkarm.exe']
options:
- --redirect _Printf=_PrintfLarge
- --redirect _Scanf=_ScanfSmall
- --semihosting
- --entry __iar_program_start
- --config
- [*tools_root, 'arm\config\generic.icf']
object_files:
path: *build_path
extension: '.o'
bin_files:
prefix: '-o'
extension: '.out'
destination: *build_path
simulator:
path: [*tools_root, 'common\bin\CSpyBat.exe']
pre_support:
- --silent
- [*tools_root, 'arm\bin\armproc.dll']
- [*tools_root, 'arm\bin\armsim.dll']
post_support:
- --plugin
- [*tools_root, 'arm\bin\armbat.dll']
- --backend
- -B
- -p
- [*tools_root, 'arm\config\debugger\atmel\ioat91sam7X256.ddf']
- -d
- sim
:cmock:
:plugins: []
:includes:
- Types.h
:mock_path: ./build/mocks

View File

@ -0,0 +1,42 @@
HERE = __dir__ + '/'
require 'rake'
require 'rake/clean'
require 'rake/testtask'
require './rakefile_helper'
include RakefileHelpers
REQUIRED_DIRS = ['./build', './build/mocks'].freeze
REQUIRED_DIRS.each do |v|
directory v
end
# Load default configuration, for now
DEFAULT_CONFIG_FILE = 'gcc.yml'.freeze
configure_toolchain(DEFAULT_CONFIG_FILE)
task :unit do
run_tests(unit_test_files)
end
desc 'Generate test summary'
task :summary do
report_summary
end
desc 'Build and test Unity'
task :all => %i[clean unit summary]
task :default => REQUIRED_DIRS + %i[clobber all]
task :ci => [:default]
task :cruise => [:default]
desc 'Load configuration'
task :config, :config_file do |_t, args|
configure_toolchain(args[:config_file])
end
desc 'Return error on Failures'
task :strict do
$return_error_on_failures = true
end

View File

@ -0,0 +1,268 @@
require 'yaml'
require 'fileutils'
require '../../vendor/unity/auto/unity_test_summary'
require '../../vendor/unity/auto/generate_test_runner'
require '../../vendor/unity/auto/colour_reporter'
module RakefileHelpers
$return_error_on_failures = false
C_EXTENSION = '.c'.freeze
def load_configuration(config_file)
$cfg_file = config_file
$cfg = YAML.load(File.read($cfg_file))
$colour_output = false unless $cfg['colour']
end
def configure_clean
CLEAN.include($cfg['compiler']['build_path'] + '*.*') unless $cfg['compiler']['build_path'].nil?
end
def configure_toolchain(config_file = DEFAULT_CONFIG_FILE)
config_file += '.yml' unless config_file =~ /\.yml$/
load_configuration(config_file)
configure_clean
end
def unit_test_files
path = $cfg['compiler']['unit_tests_path'] + 'Test*' + C_EXTENSION
path.tr!('\\', '/')
FileList.new(path)
end
def local_include_dirs
include_dirs = $cfg['compiler']['includes']['items'].dup
include_dirs.delete_if { |dir| dir.is_a?(Array) }
include_dirs
end
def extract_headers(filename)
includes = []
lines = File.readlines(filename)
lines.each do |line|
m = line.match(/^\s*#include\s+\"\s*(.+\.[hH])\s*\"/)
unless m.nil?
includes << m[1]
end
end
includes
end
def find_source_file(header, paths)
paths.each do |dir|
src_file = dir + header.ext(C_EXTENSION)
if File.exist?(src_file)
return src_file
end
end
nil
end
def tackit(strings)
case strings
when Array
"\"#{strings.join}\""
when /^-/
strings
when /\s/
"\"#{strings}\""
else
strings
end
end
def squash(prefix, items)
result = ''
items.each { |item| result += " #{prefix}#{tackit(item)}" }
result
end
def build_compiler_fields
command = tackit($cfg['compiler']['path'])
defines = if $cfg['compiler']['defines']['items'].nil?
''
else
squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'])
end
options = squash('', $cfg['compiler']['options'])
includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items'])
includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR)
{ :command => command, :defines => defines, :options => options, :includes => includes }
end
def compile(file, _defines = [])
compiler = build_compiler_fields
cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " \
"#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}"
obj_file = "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}"
execute(cmd_str + obj_file)
obj_file
end
def build_linker_fields
command = tackit($cfg['linker']['path'])
options = if $cfg['linker']['options'].nil?
''
else
squash('', $cfg['linker']['options'])
end
includes = if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil?
''
else
squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items'])
end
includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR)
{ :command => command, :options => options, :includes => includes }
end
def link_it(exe_name, obj_list)
linker = build_linker_fields
cmd_str = "#{linker[:command]}#{linker[:includes]} " +
(obj_list.map { |obj| "#{$cfg['linker']['object_files']['path']}#{obj} " }).join +
$cfg['linker']['bin_files']['prefix'] + ' ' +
$cfg['linker']['bin_files']['destination'] +
exe_name + $cfg['linker']['bin_files']['extension'] + " #{linker[:options]}"
execute(cmd_str)
end
def build_simulator_fields
return nil if $cfg['simulator'].nil?
command = if $cfg['simulator']['path'].nil?
''
else
(tackit($cfg['simulator']['path']) + ' ')
end
pre_support = if $cfg['simulator']['pre_support'].nil?
''
else
squash('', $cfg['simulator']['pre_support'])
end
post_support = if $cfg['simulator']['post_support'].nil?
''
else
squash('', $cfg['simulator']['post_support'])
end
{ :command => command, :pre_support => pre_support, :post_support => post_support }
end
def execute(command_string, verbose = true, ok_to_fail = false)
report command_string
output = `#{command_string}`.chomp
report(output) if verbose && !output.nil? && !output.empty?
unless (!$?.nil? && $?.exitstatus.zero?) || ok_to_fail
raise "Command failed. (Returned #{$?.exitstatus})"
end
output
end
def report_summary
summary = UnityTestSummary.new
summary.root = HERE
results_glob = "#{$cfg['compiler']['build_path']}*.test*"
results_glob.tr!('\\', '/')
results = Dir[results_glob]
summary.targets = results
report summary.run
raise 'There were failures' if (summary.failures > 0) && $return_error_on_failures
end
def run_tests(test_files)
report 'Running system tests...'
# Tack on TEST define for compiling unit tests
load_configuration($cfg_file)
test_defines = ['TEST']
$cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil?
$cfg['compiler']['defines']['items'] << 'TEST'
include_dirs = local_include_dirs
# Build and execute each unit test
test_files.each do |test|
obj_list = []
# Detect dependencies and build required required modules
header_list = (extract_headers(test) + ['cmock.h'] + [$cfg[:cmock][:unity_helper_path]]).compact.uniq
header_list.each do |header|
# create mocks if needed
next unless header =~ /Mock/
require '../../lib/cmock.rb'
@cmock ||= CMock.new($cfg_file)
@cmock.setup_mocks([$cfg['compiler']['source_path'] + header.gsub('Mock', '')])
end
# compile all mocks
header_list.each do |header|
# compile source file header if it exists
src_file = find_source_file(header, include_dirs)
unless src_file.nil?
obj_list << compile(src_file, test_defines)
end
end
# Build the test runner (generate if configured to do so)
test_base = File.basename(test, C_EXTENSION)
runner_name = test_base + '_Runner.c'
if $cfg['compiler']['runner_path'].nil?
runner_path = $cfg['compiler']['build_path'] + runner_name
test_gen = UnityTestRunnerGenerator.new($cfg_file)
test_gen.run(test, runner_path)
else
runner_path = $cfg['compiler']['runner_path'] + runner_name
end
obj_list << compile(runner_path, test_defines)
# Build the test module
obj_list << compile(test, test_defines)
# Link the test executable
link_it(test_base, obj_list)
# Execute unit test and generate results file
simulator = build_simulator_fields
executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension']
cmd_str = if simulator.nil?
executable
else
"#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}"
end
output = execute(cmd_str, true, true)
test_results = $cfg['compiler']['build_path'] + test_base
test_results += if output.match(/OK$/m).nil?
'.testfail'
else
'.testpass'
end
File.open(test_results, 'w') { |f| f.print output }
end
end
def build_application(main)
report 'Building application...'
obj_list = []
load_configuration($cfg_file)
main_path = $cfg['compiler']['source_path'] + main + C_EXTENSION
# Detect dependencies and build required required modules
include_dirs = local_include_dirs
extract_headers(main_path).each do |header|
src_file = find_source_file(header, include_dirs)
unless src_file.nil?
obj_list << compile(src_file)
end
end
# Build the main source file
main_base = File.basename(main_path, C_EXTENSION)
obj_list << compile(main_path)
# Create the executable
link_it(main_base, obj_list)
end
end

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,42 @@
#include "Types.h"
#include "AdcConductor.h"
#include "AdcModel.h"
#include "AdcHardware.h"
void AdcConductor_Init(void)
{
AdcHardware_Init();
}
void AdcConductor_Run(void)
{
if (AdcModel_DoGetSample() && AdcHardware_GetSampleComplete())
{
AdcModel_ProcessInput(AdcHardware_GetSample());
AdcHardware_StartConversion();
}
}
bool AdcConductor_JustHereToTest(void)
{
EXAMPLE_STRUCT_T ExampleStruct;
ExampleStruct.x = 5;
ExampleStruct.y = 7;
return AdcModel_DoNothingExceptTestASpecialType(ExampleStruct);
}
bool AdcConductor_AlsoHereToTest(void)
{
EXAMPLE_STRUCT_T example = AdcModel_DoNothingExceptReturnASpecialType();
return ((example.x == 99) && (example.y == 1));
}
bool AdcConductor_YetAnotherTest(void)
{
uint32 example = 3;
return AdModel_DoNothingExceptTestPointers(&example);
}

View File

@ -0,0 +1,11 @@
#ifndef _ADCCONDUCTOR_H
#define _ADCCONDUCTOR_H
void AdcConductor_Init(void);
void AdcConductor_Run(void);
bool AdcConductor_JustHereToTest(void);
bool AdcConductor_AlsoHereToTest(void);
bool AdcConductor_YetAnotherTest(void);
#endif // _ADCCONDUCTOR_H

View File

@ -0,0 +1,27 @@
#include "Types.h"
#include "AdcHardware.h"
#include "AdcHardwareConfigurator.h"
#include "AdcTemperatureSensor.h"
void AdcHardware_Init(void)
{
Adc_Reset();
Adc_ConfigureMode();
Adc_EnableTemperatureChannel();
Adc_StartTemperatureSensorConversion();
}
void AdcHardware_StartConversion(void)
{
Adc_StartTemperatureSensorConversion();
}
bool AdcHardware_GetSampleComplete(void)
{
return Adc_TemperatureSensorSampleReady();
}
uint16 AdcHardware_GetSample(void)
{
return Adc_ReadTemperatureSensor();
}

View File

@ -0,0 +1,9 @@
#ifndef _ADCHARDWARE_H
#define _ADCHARDWARE_H
void AdcHardware_Init(void);
void AdcHardware_StartConversion(void);
bool AdcHardware_GetSampleComplete(void);
uint16 AdcHardware_GetSample(void);
#endif // _ADCHARDWARE_H

View File

@ -0,0 +1,18 @@
#include "Types.h"
#include "AdcHardwareConfigurator.h"
#include "ModelConfig.h"
void Adc_Reset(void)
{
AT91C_BASE_ADC->ADC_CR = AT91C_ADC_SWRST;
}
void Adc_ConfigureMode(void)
{
AT91C_BASE_ADC->ADC_MR = (((uint32)11) << 8) | (((uint32)4) << 16);
}
void Adc_EnableTemperatureChannel(void)
{
AT91C_BASE_ADC->ADC_CHER = 0x10;
}

View File

@ -0,0 +1,10 @@
#ifndef _ADCHARDWARECONFIGURATOR_H
#define _ADCHARDWARECONFIGURATOR_H
#include "Types.h"
void Adc_Reset(void);
void Adc_ConfigureMode(void);
void Adc_EnableTemperatureChannel(void);
#endif // _ADCHARDWARECONFIGURATOR_H

View File

@ -0,0 +1,33 @@
#include "AdcModel.h"
#include "TaskScheduler.h"
#include "TemperatureCalculator.h"
#include "TemperatureFilter.h"
bool AdcModel_DoGetSample(void)
{
return TaskScheduler_DoAdc();
}
void AdcModel_ProcessInput(uint16 millivolts)
{
TemperatureFilter_ProcessInput(TemperatureCalculator_Calculate(millivolts));
}
bool AdcModel_DoNothingExceptTestASpecialType(EXAMPLE_STRUCT_T ExampleStruct)
{
//This doesn't really do anything. it's only here to make sure I can compare a struct.
return FALSE;
}
bool AdModel_DoNothingExceptTestPointers(uint32* pExample)
{
//This doesn't really do anything. it's only here to make sure I can compare a pointer value.
return FALSE;
}
EXAMPLE_STRUCT_T AdcModel_DoNothingExceptReturnASpecialType(void)
{
EXAMPLE_STRUCT_T example; //again, this just is here to test that I can return a struct
example.x = 99;
example.y = 1;
return example;
}

View File

@ -0,0 +1,13 @@
#ifndef _ADCMODEL_H
#define _ADCMODEL_H
#include "Types.h"
bool AdcModel_DoGetSample(void);
void AdcModel_ProcessInput(uint16 millivolts);
bool AdcModel_DoNothingExceptTestASpecialType(EXAMPLE_STRUCT_T ExampleStruct);
bool AdModel_DoNothingExceptTestPointers(uint32* pExample);
EXAMPLE_STRUCT_T AdcModel_DoNothingExceptReturnASpecialType(void);
#endif // _ADCMODEL_H

View File

@ -0,0 +1,51 @@
#include "Types.h"
#include "AdcTemperatureSensor.h"
static inline uint32 ConvertAdcCountsToPicovolts(uint32 counts);
static inline uint16 ConvertPicovoltsToMillivolts(uint32 picovolts);
//
// PUBLIC METHODS
//
void Adc_StartTemperatureSensorConversion(void)
{
AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START;
}
bool Adc_TemperatureSensorSampleReady(void)
{
return ((AT91C_BASE_ADC->ADC_SR & AT91C_ADC_EOC4) == AT91C_ADC_EOC4);
}
uint16 Adc_ReadTemperatureSensor(void)
{
uint32 picovolts = ConvertAdcCountsToPicovolts(AT91C_BASE_ADC->ADC_CDR4);
return ConvertPicovoltsToMillivolts(picovolts);
}
//
// PRIVATE HELPERS
//
static inline uint32 ConvertAdcCountsToPicovolts(uint32 counts)
{
// ADC bit weight at 10-bit resolution with 3.0V reference = 2.9296875 mV/LSB
uint32 picovoltsPerAdcCount = 2929688;
// Shift decimal point by 6 places to preserve accuracy in fixed-point math
return counts * picovoltsPerAdcCount;
}
static inline uint16 ConvertPicovoltsToMillivolts(uint32 picovolts)
{
const uint32 halfMillivoltInPicovolts = 500000;
const uint32 picovoltsPerMillivolt = 1000000;
// Add 0.5 mV to result so that truncation yields properly rounded result
picovolts += halfMillivoltInPicovolts;
// Divide appropriately to convert to millivolts
return (uint16)(picovolts / picovoltsPerMillivolt);
}

View File

@ -0,0 +1,10 @@
#ifndef _ADCTEMPERATURESENSOR_H
#define _ADCTEMPERATURESENSOR_H
#include "Types.h"
void Adc_StartTemperatureSensorConversion(void);
bool Adc_TemperatureSensorSampleReady(void);
uint16 Adc_ReadTemperatureSensor(void);
#endif // _ADCTEMPERATURESENSOR_H

View File

@ -0,0 +1,25 @@
#include "Types.h"
#include "Executor.h"
#include "Model.h"
#include "UsartConductor.h"
#include "TimerConductor.h"
#include "AdcConductor.h"
#include "IntrinsicsWrapper.h"
void Executor_Init(void)
{
Model_Init();
UsartConductor_Init();
AdcConductor_Init();
TimerConductor_Init();
Interrupt_Enable();
}
bool Executor_Run(void)
{
UsartConductor_Run();
TimerConductor_Run();
AdcConductor_Run();
return TRUE;
}

View File

@ -0,0 +1,9 @@
#ifndef _EXECUTOR_H
#define _EXECUTOR_H
#include "Types.h"
void Executor_Init(void);
bool Executor_Run(void);
#endif // _EXECUTOR_H

View File

@ -0,0 +1,18 @@
#include "IntrinsicsWrapper.h"
#ifdef __ICCARM__
#include <intrinsics.h>
#endif
void Interrupt_Enable(void)
{
#ifdef __ICCARM__
__enable_interrupt();
#endif
}
void Interrupt_Disable(void)
{
#ifdef __ICCARM__
__disable_interrupt();
#endif
}

View File

@ -0,0 +1,7 @@
#ifndef _INTRINSICS_WRAPPER_H
#define _INTRINSICS_WRAPPER_H
void Interrupt_Enable(void);
void Interrupt_Disable(void);
#endif // _INTRINSICS_WRAPPER_H

View File

@ -0,0 +1,46 @@
#include "Types.h"
#include "IntrinsicsWrapper.h"
#include "Executor.h"
#include "Model.h"
#include "TaskScheduler.h"
#include "TemperatureCalculator.h"
#include "TemperatureFilter.h"
#include "UsartConductor.h"
#include "UsartHardware.h"
#include "UsartConfigurator.h"
#include "UsartPutChar.h"
#include "UsartModel.h"
#include "UsartBaudRateRegisterCalculator.h"
#include "UsartTransmitBufferStatus.h"
#include "TimerConductor.h"
#include "TimerHardware.h"
#include "TimerConfigurator.h"
#include "TimerInterruptConfigurator.h"
#include "TimerInterruptHandler.h"
#include "TimerModel.h"
#include "AdcConductor.h"
#include "AdcHardware.h"
#include "AdcHardwareConfigurator.h"
#include "AdcTemperatureSensor.h"
#include "AdcModel.h"
int AppMain(void)
{
Executor_Init();
while(Executor_Run());
return 0;
}
#ifndef TEST
int main(void)
{
return AppMain();
}
#endif // TEST

View File

@ -0,0 +1,7 @@
#ifndef _MAIN_H_
#define _MAIN_H_
int AppMain(void);
int main(void);
#endif // _MAIN_H_

View File

@ -0,0 +1,10 @@
#include "Model.h"
#include "TaskScheduler.h"
#include "TemperatureFilter.h"
void Model_Init(void)
{
TaskScheduler_Init();
TemperatureFilter_Init();
}

View File

@ -0,0 +1,8 @@
#ifndef _MODEL_H
#define _MODEL_H
#include "Types.h"
void Model_Init(void);
#endif // _MODEL_H

View File

@ -0,0 +1,7 @@
#ifndef _MODELCONFIG_H
#define _MODELCONFIG_H
#define MASTER_CLOCK 48054857 // Master Clock
#define USART0_BAUDRATE 115200 // USART Baudrate
#endif // _MODELCONFIG_H

View File

@ -0,0 +1,72 @@
#include "Types.h"
#include "TaskScheduler.h"
typedef struct _Task
{
bool doIt;
uint32 period;
uint32 startTime;
} Task;
typedef struct _TaskSchedulerInstance
{
Task usart;
Task adc;
} TaskSchedulerInstance;
static TaskSchedulerInstance this;
void TaskScheduler_Init(void)
{
this.usart.doIt = FALSE;
this.usart.startTime = 0;
//The correct period
this.usart.period = 1000;
this.adc.doIt = FALSE;
this.adc.startTime = 0;
this.adc.period = 100;
}
void TaskScheduler_Update(uint32 time)
{
if ((time - this.usart.startTime) >= this.usart.period)
{
this.usart.doIt = TRUE;
this.usart.startTime = time - (time % this.usart.period);
}
if ((time - this.adc.startTime) >= this.adc.period)
{
this.adc.doIt = TRUE;
this.adc.startTime = time - (time % this.adc.period);
}
}
bool TaskScheduler_DoUsart(void)
{
bool doIt = FALSE;
if (this.usart.doIt)
{
doIt = TRUE;
this.usart.doIt = FALSE;
}
return doIt;
}
bool TaskScheduler_DoAdc(void)
{
bool doIt = FALSE;
if (this.adc.doIt)
{
doIt = TRUE;
this.adc.doIt = FALSE;
}
return doIt;
}

View File

@ -0,0 +1,11 @@
#ifndef _TASKSCHEDULER_H
#define _TASKSCHEDULER_H
#include "Types.h"
void TaskScheduler_Init(void);
void TaskScheduler_Update(uint32 time);
bool TaskScheduler_DoUsart(void);
bool TaskScheduler_DoAdc(void);
#endif // _TASKSCHEDULER_H

View File

@ -0,0 +1,27 @@
#include "Types.h"
#include "TemperatureCalculator.h"
#include <math.h>
#ifndef logl
#define logl log
#endif
float TemperatureCalculator_Calculate(uint16 millivolts)
{
const double supply_voltage = 3.0;
const double series_resistance = 5000;
const double coefficient_A = 316589.698;
const double coefficient_B = -0.1382009;
double sensor_voltage = ((double)millivolts / 1000);
double resistance;
if (millivolts == 0)
{
return -INFINITY;
}
// Series resistor is 5k Ohms; Reference voltage is 3.0V
// R(t) = A * e^(B*t); R is resistance of thermisor; t is temperature in C
resistance = ((supply_voltage * series_resistance) / sensor_voltage) - series_resistance;
return (float)(logl(resistance / coefficient_A) / coefficient_B);
}

View File

@ -0,0 +1,6 @@
#ifndef _TEMPERATURECALCULATOR_H
#define _TEMPERATURECALCULATOR_H
float TemperatureCalculator_Calculate(uint16 millivolts);
#endif // _TEMPERATURECALCULATOR_H

View File

@ -0,0 +1,39 @@
#include "Types.h"
#include "TemperatureFilter.h"
#include <math.h>
static bool initialized;
static float temperatureInCelcius;
void TemperatureFilter_Init(void)
{
initialized = FALSE;
temperatureInCelcius = -INFINITY;
}
float TemperatureFilter_GetTemperatureInCelcius(void)
{
return temperatureInCelcius;
}
void TemperatureFilter_ProcessInput(float temperature)
{
if (!initialized)
{
temperatureInCelcius = temperature;
initialized = TRUE;
}
else
{
if (temperature == +INFINITY ||
temperature == -INFINITY ||
temperature == +NAN ||
temperature == -NAN)
{
initialized = FALSE;
temperature = -INFINITY;
}
temperatureInCelcius = (temperatureInCelcius * 0.75f) + (temperature * 0.25);
}
}

View File

@ -0,0 +1,10 @@
#ifndef _TEMPERATUREFILTER_H
#define _TEMPERATUREFILTER_H
#include "Types.h"
void TemperatureFilter_Init(void);
float TemperatureFilter_GetTemperatureInCelcius(void);
void TemperatureFilter_ProcessInput(float temperature);
#endif // _TEMPERATUREFILTER_H

View File

@ -0,0 +1,15 @@
#include "Types.h"
#include "TimerConductor.h"
#include "TimerModel.h"
#include "TimerHardware.h"
#include "TimerInterruptHandler.h"
void TimerConductor_Init(void)
{
TimerHardware_Init();
}
void TimerConductor_Run(void)
{
TimerModel_UpdateTime(Timer_GetSystemTime());
}

View File

@ -0,0 +1,9 @@
#ifndef _TIMERCONDUCTOR_H
#define _TIMERCONDUCTOR_H
#include "Types.h"
void TimerConductor_Init(void);
void TimerConductor_Run(void);
#endif // _TIMERCONDUCTOR_H

View File

@ -0,0 +1,51 @@
#include "Types.h"
#include "TimerConfigurator.h"
#include "TimerInterruptConfigurator.h"
void Timer_EnablePeripheralClocks(void)
{
AT91C_BASE_PMC->PMC_PCER = TIMER0_CLOCK_ENABLE | PIOB_CLOCK_ENABLE;
}
void Timer_Reset(void)
{
uint32 dummy;
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
AT91C_BASE_TC0->TC_IDR = 0xffffffff;
dummy = AT91C_BASE_TC0->TC_SR;
dummy = dummy;
}
void Timer_ConfigureMode(void)
{
AT91C_BASE_TC0->TC_CMR = 0x000CC004; // ACPC=toggle TIOA on RC compare; mode=WAVE; WAVE_SEL=UP w/auto-trigger on RC compare; clock=MCK/1024
}
void Timer_ConfigurePeriod(void)
{
AT91C_BASE_TC0->TC_RC = 469; // 10ms period for timer clock source of MCK/1024 with MCK=48054857
}
void Timer_EnableOutputPin(void)
{
AT91C_BASE_PIOB->PIO_PDR = TIOA0_PIN_MASK;
}
void Timer_Enable(void)
{
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN;
}
void Timer_ConfigureInterruptHandler(void)
{
Timer_DisableInterrupt();
Timer_ResetSystemTime();
Timer_ConfigureInterrupt();
Timer_EnableInterrupt();
}
void Timer_Start(void)
{
AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG;
}

View File

@ -0,0 +1,15 @@
#ifndef _TIMERCONFIGURATOR_H
#define _TIMERCONFIGURATOR_H
#include "Types.h"
void Timer_EnablePeripheralClocks(void);
void Timer_Reset(void);
void Timer_ConfigureMode(void);
void Timer_ConfigurePeriod(void);
void Timer_EnableOutputPin(void);
void Timer_Enable(void);
void Timer_ConfigureInterruptHandler(void);
void Timer_Start(void);
#endif // _TIMERCONFIGURATOR_H

View File

@ -0,0 +1,15 @@
#include "Types.h"
#include "TimerHardware.h"
#include "TimerConfigurator.h"
void TimerHardware_Init(void)
{
Timer_EnablePeripheralClocks();
Timer_Reset();
Timer_ConfigureMode();
Timer_ConfigurePeriod();
Timer_EnableOutputPin();
Timer_Enable();
Timer_ConfigureInterruptHandler();
Timer_Start();
}

View File

@ -0,0 +1,8 @@
#ifndef _TIMERHARDWARE_H
#define _TIMERHARDWARE_H
#include "Types.h"
void TimerHardware_Init(void);
#endif // _TIMERHARDWARE_H

View File

@ -0,0 +1,55 @@
#include "Types.h"
#include "TimerInterruptConfigurator.h"
#include "TimerInterruptHandler.h"
static inline void SetInterruptHandler(void);
static inline void ConfigureInterruptSourceModeRegister(void);
static inline void ClearInterrupt(void);
static inline void EnableCompareInterruptForRegisterC(void);
void Timer_DisableInterrupt(void)
{
AT91C_BASE_AIC->AIC_IDCR = TIMER0_ID_MASK;
}
void Timer_ResetSystemTime(void)
{
Timer_SetSystemTime(0);
}
void Timer_ConfigureInterrupt(void)
{
SetInterruptHandler();
ConfigureInterruptSourceModeRegister();
ClearInterrupt();
EnableCompareInterruptForRegisterC();
}
void Timer_EnableInterrupt(void)
{
AT91C_BASE_AIC->AIC_IECR = TIMER0_ID_MASK;
}
//
// Helpers
//
static inline void SetInterruptHandler(void)
{
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (uint32)Timer_InterruptHandler;
}
static inline void ConfigureInterruptSourceModeRegister(void)
{
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = 1;
}
static inline void ClearInterrupt(void)
{
AT91C_BASE_AIC->AIC_ICCR = TIMER0_ID_MASK;
}
static inline void EnableCompareInterruptForRegisterC(void)
{
AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;
}

View File

@ -0,0 +1,13 @@
#ifndef _TIMERINTERRUPTCONFIGURATOR_H
#define _TIMERINTERRUPTCONFIGURATOR_H
#include "Types.h"
#define TIMER0_ID_MASK (((uint32)0x1) << AT91C_ID_TC0)
void Timer_DisableInterrupt(void);
void Timer_ResetSystemTime(void);
void Timer_ConfigureInterrupt(void);
void Timer_EnableInterrupt(void);
#endif // _TIMERINTERRUPTCONFIGURATOR_H

View File

@ -0,0 +1,25 @@
#include "Types.h"
#include "TimerInterruptHandler.h"
#include "TimerInterruptConfigurator.h"
static uint32 systemTime;
void Timer_SetSystemTime(uint32 time)
{
systemTime = time;
}
uint32 Timer_GetSystemTime(void)
{
return systemTime;
}
void Timer_InterruptHandler(void)
{
uint32 status = AT91C_BASE_TC0->TC_SR;
if (status & AT91C_TC_CPCS)
{
systemTime += 10;
}
}

View File

@ -0,0 +1,10 @@
#ifndef _TIMERINTERRUPTHANDLER_H
#define _TIMERINTERRUPTHANDLER_H
#include "Types.h"
void Timer_SetSystemTime(uint32 time);
uint32 Timer_GetSystemTime(void);
void Timer_InterruptHandler(void);
#endif // _TIMERINTERRUPTHANDLER_H

View File

@ -0,0 +1,9 @@
#include "Types.h"
#include "TimerModel.h"
#include "TaskScheduler.h"
void TimerModel_UpdateTime(uint32 systemTime)
{
TaskScheduler_Update(systemTime);
}

View File

@ -0,0 +1,8 @@
#ifndef _TIMERMODEL_H
#define _TIMERMODEL_H
#include "Types.h"
void TimerModel_UpdateTime(uint32 systemTime);
#endif // _TIMERMODEL_H

View File

@ -0,0 +1,103 @@
#ifndef _MYTYPES_H_
#define _MYTYPES_H_
#include "AT91SAM7X256.h"
#include <math.h>
#ifndef __monitor
#define __monitor
#endif
// Peripheral Helper Definitions
#define USART0_CLOCK_ENABLE (AT91C_ID_US0)
#define USART0_TX_PIN (AT91C_PA1_TXD0)
#define TIMER0_CLOCK_ENABLE (((uint32)0x1) << AT91C_ID_TC0)
#define PIOA_CLOCK_ENABLE (((uint32)0x1) << AT91C_ID_PIOA)
#define PIOB_CLOCK_ENABLE (((uint32)0x1) << AT91C_ID_PIOB)
#define TIOA0_PIN_MASK (((uint32)0x1) << 23) // Timer/Counter Output Pin
// Application Type Definitions
typedef unsigned int uint32;
typedef int int32;
typedef unsigned short uint16;
typedef short int16;
typedef unsigned char uint8;
typedef char int8;
typedef char bool;
// Application Special Value Definitions
#ifndef TRUE
#define TRUE (1)
#endif
#ifndef FALSE
#define FALSE (0)
#endif
#ifndef NULL
#define NULL (0)
#endif // NULL
#define DONT_CARE (0)
#ifndef INFINITY
#define INFINITY (1.0 / 0.0)
#endif
#ifndef NAN
#define NAN (0.0 / 0.0)
#endif
// MIN/MAX Definitions for Standard Types
#ifndef INT8_MAX
#define INT8_MAX 127
#endif
#ifndef INT8_MIN
#define INT8_MIN (-128)
#endif
#ifndef UINT8_MAX
#define UINT8_MAX 0xFFU
#endif
#ifndef UINT8_MIN
#define UINT8_MIN 0x00U
#endif
#ifndef INT16_MAX
#define INT16_MAX 32767
#endif
#ifndef INT16_MIN
#define INT16_MIN (-32768)
#endif
#ifndef UINT16_MAX
#define UINT16_MAX 0xFFFFU
#endif
#ifndef UINT16_MIN
#define UINT16_MIN 0x0000U
#endif
#ifndef INT32_MAX
#define INT32_MAX 0x7FFFFFFF
#endif
#ifndef INT32_MIN
#define INT32_MIN (-INT32_MAX - 1)
#endif
#ifndef UINT32_MAX
#define UINT32_MAX 0xFFFFFFFFU
#endif
#ifndef UINT32_MIN
#define UINT32_MIN 0x00000000U
#endif
typedef struct _EXAMPLE_STRUCT_T
{
int x;
int y;
} EXAMPLE_STRUCT_T;
#endif // _MYTYPES_H_

View File

@ -0,0 +1,18 @@
#include "Types.h"
#include "UsartBaudRateRegisterCalculator.h"
uint8 UsartModel_CalculateBaudRateRegisterSetting(uint32 masterClock, uint32 baudRate)
{
uint32 registerSetting = ((masterClock * 10) / (baudRate * 16));
if ((registerSetting % 10) >= 5)
{
registerSetting = (registerSetting / 10) + 1;
}
else
{
registerSetting /= 10;
}
return (uint8)registerSetting;
}

View File

@ -0,0 +1,6 @@
#ifndef _USARTBAUDRATEREGISTERCALCULATOR_H
#define _USARTBAUDRATEREGISTERCALCULATOR_H
uint8 UsartModel_CalculateBaudRateRegisterSetting(uint32 masterClock, uint32 baudRate);
#endif // _USARTBAUDRATEREGISTERCALCULATOR_H

View File

@ -0,0 +1,21 @@
#include "Types.h"
#include "UsartConductor.h"
#include "UsartHardware.h"
#include "UsartModel.h"
#include "TaskScheduler.h"
void UsartConductor_Init(void)
{
UsartHardware_Init(UsartModel_GetBaudRateRegisterSetting());
UsartHardware_TransmitString(UsartModel_GetWakeupMessage());
}
void UsartConductor_Run(void)
{
char* temp;
if (TaskScheduler_DoUsart())
{
temp = UsartModel_GetFormattedTemperature();
UsartHardware_TransmitString(temp);
}
}

View File

@ -0,0 +1,7 @@
#ifndef _USARTCONDUCTOR_H
#define _USARTCONDUCTOR_H
void UsartConductor_Init(void);
void UsartConductor_Run(void);
#endif // _USARTCONDUCTOR_H

View File

@ -0,0 +1,39 @@
#include "Types.h"
#include "UsartConfigurator.h"
void Usart_ConfigureUsartIO(void)
{
AT91C_BASE_PIOA->PIO_ASR = USART0_TX_PIN;
AT91C_BASE_PIOA->PIO_BSR = 0;
AT91C_BASE_PIOA->PIO_PDR = USART0_TX_PIN;
}
void Usart_EnablePeripheralClock(void)
{
AT91C_BASE_PMC->PMC_PCER = ((uint32)1) << USART0_CLOCK_ENABLE;
}
void Usart_Reset(void)
{
AT91C_BASE_US0->US_IDR = 0xffffffff;
AT91C_BASE_US0->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS;
}
void Usart_ConfigureMode(void)
{
AT91C_BASE_US0->US_MR = AT91C_US_USMODE_NORMAL |
AT91C_US_NBSTOP_1_BIT |
AT91C_US_PAR_NONE |
AT91C_US_CHRL_8_BITS |
AT91C_US_CLKS_CLOCK;
}
void Usart_SetBaudRateRegister(uint8 baudRateRegisterSetting)
{
AT91C_BASE_US0->US_BRGR = baudRateRegisterSetting;
}
void Usart_Enable(void)
{
AT91C_BASE_US0->US_CR = AT91C_US_TXEN;
}

View File

@ -0,0 +1,13 @@
#ifndef _USARTCONFIGURATOR_H
#define _USARTCONFIGURATOR_H
#include "Types.h"
void Usart_ConfigureUsartIO(void);
void Usart_EnablePeripheralClock(void);
void Usart_Reset(void);
void Usart_ConfigureMode(void);
void Usart_SetBaudRateRegister(uint8 baudRateRegisterSetting);
void Usart_Enable(void);
#endif // _USARTCONFIGURATOR_H

View File

@ -0,0 +1,22 @@
#include "Types.h"
#include "UsartHardware.h"
#include "UsartConfigurator.h"
#include "UsartPutChar.h"
void UsartHardware_Init(uint8 baudRateRegisterSetting)
{
Usart_ConfigureUsartIO();
Usart_EnablePeripheralClock();
Usart_Reset();
Usart_ConfigureMode();
Usart_SetBaudRateRegister(baudRateRegisterSetting);
Usart_Enable();
}
void UsartHardware_TransmitString(char* data)
{
while(*data != NULL)
{
Usart_PutChar(*data++);
}
}

View File

@ -0,0 +1,9 @@
#ifndef _USARTHARDWARE_H
#define _USARTHARDWARE_H
#include "Types.h"
void UsartHardware_Init(uint8 baudRateRegisterSetting);
void UsartHardware_TransmitString(char* data);
#endif // _USARTHARDWARE_H

View File

@ -0,0 +1,34 @@
#include "Types.h"
#include "UsartModel.h"
#include "ModelConfig.h"
#include "UsartBaudRateRegisterCalculator.h"
#include "TemperatureFilter.h"
#include <stdio.h>
#include <math.h>
char formattedTemperature[32];
char* wakeup = "It's Awesome Time!\n";
uint8 UsartModel_GetBaudRateRegisterSetting(void)
{
return UsartModel_CalculateBaudRateRegisterSetting(MASTER_CLOCK, USART0_BAUDRATE);
}
char* UsartModel_GetFormattedTemperature(void)
{
float temperature = TemperatureFilter_GetTemperatureInCelcius();
if (temperature == -INFINITY)
{
sprintf(formattedTemperature, "%s", "Temperature sensor failure!\n");
}
else
{
sprintf(formattedTemperature, "%.1f C\n", temperature);
}
return formattedTemperature;
}
char* UsartModel_GetWakeupMessage(void)
{
return wakeup;
}

View File

@ -0,0 +1,10 @@
#ifndef _USARTMODEL_H
#define _USARTMODEL_H
#include "Types.h"
uint8 UsartModel_GetBaudRateRegisterSetting(void);
char* UsartModel_GetFormattedTemperature(void);
char* UsartModel_GetWakeupMessage(void);
#endif // _USARTMODEL_H

View File

@ -0,0 +1,16 @@
#include "Types.h"
#include "UsartPutChar.h"
#include "UsartTransmitBufferStatus.h"
#ifdef SIMULATE
#include <stdio.h>
#endif
void Usart_PutChar(char data)
{
while(!Usart_ReadyToTransmit());
#ifdef SIMULATE
printf("%c", data);
#else
AT91C_BASE_US0->US_THR = data;
#endif
}

View File

@ -0,0 +1,8 @@
#ifndef _USARTPUT_HAR_H
#define _USARTPUT_HAR_H
#include "Types.h"
void Usart_PutChar(char data);
#endif // _USARTPUT_HAR_H

View File

@ -0,0 +1,7 @@
#include "Types.h"
#include "UsartTransmitBufferStatus.h"
bool Usart_ReadyToTransmit(void)
{
return (AT91C_BASE_US0->US_CSR & AT91C_US_TXRDY) > 0;
}

View File

@ -0,0 +1,8 @@
#ifndef _USARTTRANSMITBUFFERSTATUS_H
#define _USARTTRANSMITBUFFERSTATUS_H
#include "Types.h"
bool Usart_ReadyToTransmit(void);
#endif // _USARTTRANSMITBUFFERSTATUS_H

View File

@ -0,0 +1,121 @@
#include "unity.h"
#include "UnityHelper.h"
#include "Types.h"
#include "Types.h"
#include "AdcConductor.h"
#include "MockAdcModel.h"
#include "MockAdcHardware.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void testInitShouldCallHardwareInit(void)
{
AdcHardware_Init_Expect();
AdcConductor_Init();
}
void testRunShouldNotDoAnythingIfItIsNotTime(void)
{
AdcModel_DoGetSample_ExpectAndReturn(FALSE);
AdcConductor_Run();
}
void testRunShouldNotPassAdcResultToModelIfSampleIsNotComplete(void)
{
AdcModel_DoGetSample_ExpectAndReturn(TRUE);
AdcHardware_GetSampleComplete_ExpectAndReturn(FALSE);
AdcConductor_Run();
}
void testRunShouldGetLatestSampleFromAdcAndPassItToModelAndStartNewConversionWhenItIsTime(void)
{
AdcModel_DoGetSample_ExpectAndReturn(TRUE);
AdcHardware_GetSampleComplete_ExpectAndReturn(TRUE);
AdcHardware_GetSample_ExpectAndReturn(293U);
AdcModel_ProcessInput_Expect(293U);
AdcHardware_StartConversion_Expect();
AdcConductor_Run();
}
void testJustHereToTest_Should_ProperlyPassAStructAndVerifyIt(void)
{
EXAMPLE_STRUCT_T TestStruct;
TestStruct.x = 5;
TestStruct.y = 7;
AdcModel_DoNothingExceptTestASpecialType_ExpectAndReturn(TestStruct, TRUE);
TEST_ASSERT_TRUE(AdcConductor_JustHereToTest());
}
//void testJustHereToTest_Should_FailThisTestIfYouUncommentXIsBecauseItsWrong(void)
//{
// EXAMPLE_STRUCT_T TestStruct;
// TestStruct.x = 6;
// TestStruct.y = 7;
//
// AdcModel_DoNothingExceptTestASpecialType_ExpectAndReturn(TestStruct, TRUE);
//
// TEST_ASSERT_TRUE(AdcConductor_JustHereToTest());
//}
//
//void testJustHereToTest_Should_FailThisTestIfYouUncommentYIsBecauseItsWrong(void)
//{
// EXAMPLE_STRUCT_T TestStruct;
// TestStruct.x = 5;
// TestStruct.y = 8;
//
// AdcModel_DoNothingExceptTestASpecialType_ExpectAndReturn(TestStruct, TRUE);
//
// TEST_ASSERT_TRUE(AdcConductor_JustHereToTest());
//}
void test_AdcConductor_AlsoHereToTest_Should_ProperlyReturnAStructAsExpected1(void)
{
EXAMPLE_STRUCT_T TestStruct;
TestStruct.x = 99;
TestStruct.y = 1;
AdcModel_DoNothingExceptReturnASpecialType_ExpectAndReturn(TestStruct);
TEST_ASSERT_TRUE(AdcConductor_AlsoHereToTest());
}
void test_AdcConductor_AlsoHereToTest_Should_ProperlyReturnAStructAsExpected2(void)
{
EXAMPLE_STRUCT_T TestStruct;
TestStruct.x = 98;
TestStruct.y = 1;
AdcModel_DoNothingExceptReturnASpecialType_ExpectAndReturn(TestStruct);
TEST_ASSERT_FALSE(AdcConductor_AlsoHereToTest());
}
void test_AdcConductor_YetAnotherTest_Should_VerifyThatPointersToStructsAreTestable(void)
{
uint32 TestNum = 3;
AdModel_DoNothingExceptTestPointers_ExpectAndReturn(&TestNum, TRUE);
TEST_ASSERT_TRUE(AdcConductor_YetAnotherTest());
}
//void test_AdcConductor_YetAnotherTest_Should_FailIfYouUncommentThisTestBecauseTheValuePointedToIsWrong(void)
//{
// uint32 TestNum = 7;
//
// AdModel_DoNothingExceptTestPointers_ExpectAndReturn(&TestNum, FALSE);
//
// TEST_ASSERT_FALSE(AdcConductor_YetAnotherTest());
//}

View File

@ -0,0 +1,44 @@
#include "unity.h"
#include "Types.h"
#include "AdcHardware.h"
#include "MockAdcHardwareConfigurator.h"
#include "MockAdcTemperatureSensor.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void testInitShouldDelegateToConfiguratorAndTemperatureSensor(void)
{
Adc_Reset_Expect();
Adc_ConfigureMode_Expect();
Adc_EnableTemperatureChannel_Expect();
Adc_StartTemperatureSensorConversion_Expect();
AdcHardware_Init();
}
void testGetSampleCompleteShouldReturn_FALSE_WhenTemperatureSensorSampleReadyReturns_FALSE(void)
{
Adc_TemperatureSensorSampleReady_ExpectAndReturn(FALSE);
TEST_ASSERT(!AdcHardware_GetSampleComplete());
}
void testGetSampleCompleteShouldReturn_TRUE_WhenTemperatureSensorSampleReadyReturns_TRUE(void)
{
Adc_TemperatureSensorSampleReady_ExpectAndReturn(TRUE);
TEST_ASSERT(AdcHardware_GetSampleComplete());
}
void testGetSampleShouldDelegateToAdcTemperatureSensor(void)
{
uint16 sample;
Adc_ReadTemperatureSensor_ExpectAndReturn(847);
sample = AdcHardware_GetSample();
TEST_ASSERT_EQUAL(847, sample);
}

View File

@ -0,0 +1,43 @@
#include "unity.h"
#include "Types.h"
#include "AdcHardwareConfigurator.h"
#include "AT91SAM7X256.h"
#include "ModelConfig.h"
AT91S_ADC AdcPeripheral;
void setUp(void)
{
}
void tearDown(void)
{
}
void testResetShouldResetTheAdcConverterPeripheral(void)
{
AT91C_BASE_ADC->ADC_CR = 0;
Adc_Reset();
TEST_ASSERT_EQUAL(AT91C_ADC_SWRST, AT91C_BASE_ADC->ADC_CR);
}
void testConfigureModeShouldSetAdcModeRegisterAppropriately(void)
{
uint32 prescaler = (MASTER_CLOCK / (2 * 2000000)) - 1; // 5MHz ADC clock
AT91C_BASE_ADC->ADC_MR = 0;
Adc_ConfigureMode();
TEST_ASSERT_EQUAL(prescaler, (AT91C_BASE_ADC->ADC_MR & AT91C_ADC_PRESCAL) >> 8);
}
void testEnableTemperatureChannelShouldEnableTheAppropriateAdcInput(void)
{
AT91C_BASE_ADC->ADC_CHER = 0;
Adc_EnableTemperatureChannel();
TEST_ASSERT_EQUAL(0x1 << 4, AT91C_BASE_ADC->ADC_CHER);
}

View File

@ -0,0 +1,33 @@
#include "unity.h"
#include "Types.h"
#include "AdcModel.h"
#include "MockTaskScheduler.h"
#include "MockTemperatureCalculator.h"
#include "MockTemperatureFilter.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void testDoGetSampleShouldReturn_FALSE_WhenTaskSchedulerReturns_FALSE(void)
{
TaskScheduler_DoAdc_ExpectAndReturn(FALSE);
TEST_ASSERT_EQUAL(FALSE, AdcModel_DoGetSample());
}
void testDoGetSampleShouldReturn_TRUE_WhenTaskSchedulerReturns_TRUE(void)
{
TaskScheduler_DoAdc_ExpectAndReturn(TRUE);
TEST_ASSERT_EQUAL(TRUE, AdcModel_DoGetSample());
}
void testProcessInputShouldDelegateToTemperatureCalculatorAndPassResultToFilter(void)
{
TemperatureCalculator_Calculate_ExpectAndReturn(21473, 23.5f);
TemperatureFilter_ProcessInput_Expect(23.5f);
AdcModel_ProcessInput(21473);
}

View File

@ -0,0 +1,47 @@
#include "unity.h"
#include "Types.h"
#include "AdcTemperatureSensor.h"
#include "AT91SAM7X256.h"
AT91S_ADC AdcPeripheral;
void setUp(void)
{
}
void tearDown(void)
{
}
void testShouldStartTemperatureSensorConversionWhenTriggered(void)
{
AT91C_BASE_ADC->ADC_CR = 0;
Adc_StartTemperatureSensorConversion();
TEST_ASSERT_EQUAL(AT91C_ADC_START, AT91C_BASE_ADC->ADC_CR);
}
void testTemperatureSensorSampleReadyShouldReturnChannelConversionCompletionStatus(void)
{
AT91C_BASE_ADC->ADC_SR = 0;
TEST_ASSERT_EQUAL(FALSE, Adc_TemperatureSensorSampleReady());
AT91C_BASE_ADC->ADC_SR = ~AT91C_ADC_EOC4;
TEST_ASSERT_EQUAL(FALSE, Adc_TemperatureSensorSampleReady());
AT91C_BASE_ADC->ADC_SR = AT91C_ADC_EOC4;
TEST_ASSERT_EQUAL(TRUE, Adc_TemperatureSensorSampleReady());
AT91C_BASE_ADC->ADC_SR = 0xffffffff;
TEST_ASSERT_EQUAL(TRUE, Adc_TemperatureSensorSampleReady());
}
void testReadTemperatureSensorShouldFetchAndTranslateLatestReadingToMillivolts(void)
{
uint16 result;
// ADC bit weight at 10-bit resolution with 3.0V reference = 2.9296875 mV/LSB
AT91C_BASE_ADC->ADC_CDR4 = 138;
result = Adc_ReadTemperatureSensor();
TEST_ASSERT_EQUAL(404, result);
AT91C_BASE_ADC->ADC_CDR4 = 854;
result = Adc_ReadTemperatureSensor();
TEST_ASSERT_EQUAL(2502, result);
}

View File

@ -0,0 +1,36 @@
#include "unity.h"
#include "Types.h"
#include "Executor.h"
#include "MockModel.h"
#include "MockUsartConductor.h"
#include "MockAdcConductor.h"
#include "MockTimerConductor.h"
#include "MockIntrinsicsWrapper.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void testInitShouldCallInitOfAllConductorsAndTheModel(void)
{
Model_Init_Expect();
UsartConductor_Init_Expect();
AdcConductor_Init_Expect();
TimerConductor_Init_Expect();
Interrupt_Enable_Expect();
Executor_Init();
}
void testRunShouldCallRunForEachConductorAndReturnTrueAlways(void)
{
UsartConductor_Run_Expect();
TimerConductor_Run_Expect();
AdcConductor_Run_Expect();
TEST_ASSERT_EQUAL(TRUE, Executor_Run());
}

View File

@ -0,0 +1,24 @@
#include "unity.h"
#include "Types.h"
#include "MockExecutor.h"
#include "Main.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void testMainShouldCallExecutorInitAndContinueToCallExecutorRunUntilHalted(void)
{
Executor_Init_Expect();
Executor_Run_ExpectAndReturn(TRUE);
Executor_Run_ExpectAndReturn(TRUE);
Executor_Run_ExpectAndReturn(TRUE);
Executor_Run_ExpectAndReturn(TRUE);
Executor_Run_ExpectAndReturn(FALSE);
AppMain();
}

View File

@ -0,0 +1,20 @@
#include "unity.h"
#include "Types.h"
#include "Model.h"
#include "MockTaskScheduler.h"
#include "MockTemperatureFilter.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void testInitShouldCallSchedulerAndTemperatureFilterInit(void)
{
TaskScheduler_Init_Expect();
TemperatureFilter_Init_Expect();
Model_Init();
}

View File

@ -0,0 +1,104 @@
#include "unity.h"
#include "Types.h"
#include "TaskScheduler.h"
void setUp(void)
{
TaskScheduler_Init();
}
void tearDown(void)
{
}
void testShouldScheduleUsartTaskAfter1000ms(void)
{
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoUsart());
TaskScheduler_Update(999);
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoUsart());
TaskScheduler_Update(1000);
TEST_ASSERT_EQUAL(TRUE, TaskScheduler_DoUsart());
}
void testShouldClearUsartDoFlagAfterReported(void)
{
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoUsart());
TaskScheduler_Update(1000);
TEST_ASSERT_EQUAL(TRUE, TaskScheduler_DoUsart());
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoUsart());
}
void testShouldScheduleUsartTaskEvery1000ms(void)
{
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoUsart());
TaskScheduler_Update(1300);
TEST_ASSERT_EQUAL(TRUE, TaskScheduler_DoUsart());
TaskScheduler_Update(2000);
TEST_ASSERT_EQUAL(TRUE, TaskScheduler_DoUsart());
TaskScheduler_Update(3100);
TEST_ASSERT_EQUAL(TRUE, TaskScheduler_DoUsart());
}
void testShouldScheduleUsartTaskOnlyOncePerPeriod(void)
{
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoUsart());
TaskScheduler_Update(1000);
TEST_ASSERT_EQUAL(TRUE, TaskScheduler_DoUsart());
TaskScheduler_Update(1001);
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoUsart());
TaskScheduler_Update(1999);
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoUsart());
TaskScheduler_Update(2000);
TEST_ASSERT_EQUAL(TRUE, TaskScheduler_DoUsart());
}
void testShouldScheduleAdcTaskAfter100ms(void)
{
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoAdc());
TaskScheduler_Update(99);
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoAdc());
TaskScheduler_Update(100);
TEST_ASSERT_EQUAL(TRUE, TaskScheduler_DoAdc());
}
void testShouldClearAdcDoFlagAfterReported(void)
{
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoAdc());
TaskScheduler_Update(100);
TEST_ASSERT_EQUAL(TRUE, TaskScheduler_DoAdc());
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoAdc());
}
void testShouldScheduleAdcTaskEvery100ms(void)
{
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoAdc());
TaskScheduler_Update(121);
TEST_ASSERT_EQUAL(TRUE, TaskScheduler_DoAdc());
TaskScheduler_Update(200);
TEST_ASSERT_EQUAL(TRUE, TaskScheduler_DoAdc());
TaskScheduler_Update(356);
TEST_ASSERT_EQUAL(TRUE, TaskScheduler_DoAdc());
}
void testShouldScheduleAdcTaskOnlyOncePerPeriod(void)
{
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoAdc());
TaskScheduler_Update(100);
TEST_ASSERT_EQUAL(TRUE, TaskScheduler_DoAdc());
TaskScheduler_Update(101);
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoAdc());
TaskScheduler_Update(199);
TEST_ASSERT_EQUAL(FALSE, TaskScheduler_DoAdc());
TaskScheduler_Update(200);
TEST_ASSERT_EQUAL(TRUE, TaskScheduler_DoAdc());
}

View File

@ -0,0 +1,33 @@
#include "unity.h"
#include "Types.h"
#include "TemperatureCalculator.h"
#include <math.h>
void setUp(void)
{
}
void tearDown(void)
{
}
void testTemperatureCalculatorShouldCalculateTemperatureFromMillivolts(void)
{
float result;
// Series resistor is 5k Ohms; Reference voltage is 3.0V
// R(t) = A * e^(B*t); R is resistance of thermisor; t is temperature in C
result = TemperatureCalculator_Calculate(1000);
TEST_ASSERT_FLOAT_WITHIN(0.01f, 25.0f, result);
result = TemperatureCalculator_Calculate(2985);
TEST_ASSERT_FLOAT_WITHIN(0.01f, 68.317f, result);
result = TemperatureCalculator_Calculate(3);
TEST_ASSERT_FLOAT_WITHIN(0.01f, -19.96f, result);
}
void testShouldReturnNegativeInfinityWhen_0_millivoltsInput(void)
{
TEST_ASSERT_FLOAT_WITHIN(0.0000001f, -INFINITY, TemperatureCalculator_Calculate(0));
}

View File

@ -0,0 +1,69 @@
#include "unity.h"
#include "Types.h"
#include "TemperatureFilter.h"
#include <math.h>
void setUp(void)
{
TemperatureFilter_Init();
}
void tearDown(void)
{
}
void testShouldInitializeTemeratureToInvalidValue(void)
{
TemperatureFilter_Init();
TEST_ASSERT_FLOAT_WITHIN(0.0001f, -INFINITY, TemperatureFilter_GetTemperatureInCelcius());
}
void testShouldInitializeTemperatureAfterCallToInit(void)
{
TemperatureFilter_Init();
TemperatureFilter_ProcessInput(17.8f);
TEST_ASSERT_FLOAT_WITHIN(0.0001f, 17.8f, TemperatureFilter_GetTemperatureInCelcius());
TemperatureFilter_Init();
TemperatureFilter_ProcessInput(32.6f);
TEST_ASSERT_FLOAT_WITHIN(0.0001f, 32.6f, TemperatureFilter_GetTemperatureInCelcius());
}
void setValueAndVerifyResponse(float input, float response)
{
float actual;
TemperatureFilter_ProcessInput(input);
actual = TemperatureFilter_GetTemperatureInCelcius();
TEST_ASSERT_FLOAT_WITHIN(0.0001f, response, actual);
}
void testShouldWeightEachSubsequentValueBy25PercentAfterInitialValue(void)
{
TemperatureFilter_Init();
setValueAndVerifyResponse(0.0f, 0.0f);
setValueAndVerifyResponse(10.0f, 2.5f);
setValueAndVerifyResponse(10.0f, 4.375f);
setValueAndVerifyResponse(10.0f, 5.78125f);
TemperatureFilter_Init();
setValueAndVerifyResponse(100.0f, 100.0f);
setValueAndVerifyResponse(0.0f, 75.0f);
setValueAndVerifyResponse(0.0f, 56.25f);
setValueAndVerifyResponse(0.0f, 42.1875f);
}
void setInvalidTemperatureAndVerifyReinitialized(float invalidTemperature)
{
TemperatureFilter_Init();
setValueAndVerifyResponse(100.0f, 100.0f);
setValueAndVerifyResponse(invalidTemperature, -INFINITY);
setValueAndVerifyResponse(14.3f, 14.3f);
}
void testShouldResetAverageIfPassedInfinityOrInvalidValue(void)
{
setInvalidTemperatureAndVerifyReinitialized(-INFINITY);
setInvalidTemperatureAndVerifyReinitialized(+INFINITY);
setInvalidTemperatureAndVerifyReinitialized(+NAN);
setInvalidTemperatureAndVerifyReinitialized(-NAN);
}

View File

@ -0,0 +1,32 @@
#include "unity.h"
#include "Types.h"
#include "TimerConductor.h"
#include "MockTimerHardware.h"
#include "MockTimerModel.h"
#include "MockTimerInterruptHandler.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void testInitShouldCallHardwareInit(void)
{
TimerHardware_Init_Expect();
TimerConductor_Init();
}
void testRunShouldGetSystemTimeAndPassOnToModelForEventScheduling(void)
{
Timer_GetSystemTime_ExpectAndReturn(1230);
TimerModel_UpdateTime_Expect(1230);
TimerConductor_Run();
Timer_GetSystemTime_ExpectAndReturn(837460);
TimerModel_UpdateTime_Expect(837460);
TimerConductor_Run();
}

View File

@ -0,0 +1,112 @@
#include "unity.h"
#include "Types.h"
#include "TimerConfigurator.h"
#include "AT91SAM7X256.h"
#include "MockTimerInterruptConfigurator.h"
AT91S_PMC PmcPeripheral;
AT91S_TC TimerCounter0Peripheral;
AT91S_PIO PioBPeripheral;
void setUp(void)
{
}
void tearDown(void)
{
}
void testEnablePeripheralClocksShouldEnableClockToTimer0Peripheral(void)
{
AT91C_BASE_PMC->PMC_PCER = 0;
Timer_EnablePeripheralClocks();
TEST_ASSERT_EQUAL(
TIMER0_CLOCK_ENABLE,
AT91C_BASE_PMC->PMC_PCER & TIMER0_CLOCK_ENABLE);
}
void testEnablePeripheralClocksShouldEnableClockToPIOBPeripheral(void)
{
AT91C_BASE_PMC->PMC_PCER = 0;
Timer_EnablePeripheralClocks();
TEST_ASSERT_EQUAL(
PIOB_CLOCK_ENABLE,
AT91C_BASE_PMC->PMC_PCER & PIOB_CLOCK_ENABLE);
}
void testResetShouldSetTimer0ClockDisableBit_DisableTimer0Interrupts_ClearStatusRegister(void)
{
AT91C_BASE_TC0->TC_CCR = 0;
AT91C_BASE_TC0->TC_IDR = 0;
AT91C_BASE_TC0->TC_SR = 0xFFFFFFFF;
Timer_Reset();
TEST_ASSERT_EQUAL(0x00000002, AT91C_BASE_TC0->TC_CCR);
TEST_ASSERT_EQUAL(0xffffffff, AT91C_BASE_TC0->TC_IDR);
// CANNOT BE VERIFIED!! TEST_ASSERT_EQUAL(0X00000000, AT91C_BASE_TC0->TC_SR);
}
void testEnableOutputPinShouldEnable_TIOA0_DigitalOutput(void)
{
AT91C_BASE_PIOB->PIO_PDR = 0;
Timer_EnableOutputPin();
TEST_ASSERT_EQUAL(TIOA0_PIN_MASK, AT91C_BASE_PIOB->PIO_PDR);
}
void testConfigureModeShouldConfigureTimer0ClockSourceForMasterClockDividedBy1024(void)
{
AT91C_BASE_TC0->TC_CMR = 0;
Timer_ConfigureMode();
TEST_ASSERT_EQUAL(0x00000004, AT91C_BASE_TC0->TC_CMR & 0x00000007);
}
void testConfigureModeShouldConfigureTimer0ForWaveGeneration(void)
{
AT91C_BASE_TC0->TC_CMR = 0;
Timer_ConfigureMode();
TEST_ASSERT_EQUAL(0x00008000, AT91C_BASE_TC0->TC_CMR & 0x00008000);
}
void testConfigureModeShouldConfigureTimer0ForUpModeWithAutomaticTriggerOnRCCompare(void)
{
AT91C_BASE_TC0->TC_CMR = 0;
Timer_ConfigureMode();
TEST_ASSERT_EQUAL(0x00004000, AT91C_BASE_TC0->TC_CMR & 0x00006000);
}
void testConfigureModeShouldConfigureTimer0ToToggleTIOAOnRCCompare(void)
{
AT91C_BASE_TC0->TC_CMR = 0;
Timer_ConfigureMode();
TEST_ASSERT_EQUAL(0x000C0000, AT91C_BASE_TC0->TC_CMR & 0x000C0000);
}
void testConfigurePeriodShouldConfigureRegisterCFor10msInterval(void)
{
AT91C_BASE_TC0->TC_RC = 0;
Timer_ConfigurePeriod();
TEST_ASSERT_EQUAL(469, AT91C_BASE_TC0->TC_RC);
}
void testEnableShouldSetEnableFlagForTimer0(void)
{
AT91C_BASE_TC0->TC_CCR = 0;
Timer_Enable();
TEST_ASSERT_EQUAL_INT(1, AT91C_BASE_TC0->TC_CCR);
}
void testConfigureInterruptHandler(void)
{
Timer_DisableInterrupt_Expect();
Timer_ResetSystemTime_Expect();
Timer_ConfigureInterrupt_Expect();
Timer_EnableInterrupt_Expect();
Timer_ConfigureInterruptHandler();
}
void testStartShouldSetSoftwareTriggerFlag(void)
{
AT91C_BASE_TC0->TC_CCR = 0;
Timer_Start();
TEST_ASSERT_EQUAL(0x04, AT91C_BASE_TC0->TC_CCR);
}

View File

@ -0,0 +1,26 @@
#include "unity.h"
#include "Types.h"
#include "TimerHardware.h"
#include "MockTimerConfigurator.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void testInitShouldDelegateAppropriatelyToConfigurator(void)
{
Timer_EnablePeripheralClocks_Expect();
Timer_Reset_Expect();
Timer_ConfigureMode_Expect();
Timer_ConfigurePeriod_Expect();
Timer_EnableOutputPin_Expect();
Timer_Enable_Expect();
Timer_ConfigureInterruptHandler_Expect();
Timer_Start_Expect();
TimerHardware_Init();
}

View File

@ -0,0 +1,78 @@
#include "unity.h"
#include "Types.h"
#include "TimerInterruptConfigurator.h"
#include "MockTimerInterruptHandler.h"
#include "AT91SAM7X256.h"
AT91S_AIC AicPeripheral;
AT91S_TC TimerCounter0Peripheral;
void setUp(void)
{
}
void tearDown(void)
{
}
void test_TIMER0_ID_MASK_ShouldBeCorrect(void)
{
TEST_ASSERT_EQUAL(((uint32)0x1) << AT91C_ID_TC0, TIMER0_ID_MASK);
}
void testDisableInterruptDisablesTimer0InterruptInTheInterruptController(void)
{
AT91C_BASE_AIC->AIC_IDCR = 0;
Timer_DisableInterrupt();
TEST_ASSERT_EQUAL(TIMER0_ID_MASK, AT91C_BASE_AIC->AIC_IDCR);
}
void testResetSystemTimeDelegatesTo_Timer_SetSystemTime_Appropriately(void)
{
Timer_SetSystemTime_Expect(0);
Timer_ResetSystemTime();
}
void testConfigureInterruptShouldSetInterruptHandlerAppropriately(void)
{
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (uint32)NULL;
Timer_ConfigureInterrupt();
TEST_ASSERT_EQUAL((uint32)Timer_InterruptHandler, AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0]);
}
void testConfigureInterruptShouldSetInterruptLevelInSourceModeRegisterAppropriately(void)
{
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = 0;
Timer_ConfigureInterrupt();
TEST_ASSERT_EQUAL(
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] & 0x00000060);
}
void testConfigureInterruptShouldSetInterruptPriorityInSourceModeRegisterAppropriately(void)
{
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = 0;
Timer_ConfigureInterrupt();
TEST_ASSERT_EQUAL(1, AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] & 0x00000007);
}
void testConfigureInterruptShouldClearTimer0InterruptOnTheInterruptController(void)
{
AT91C_BASE_AIC->AIC_ICCR = 0;
Timer_ConfigureInterrupt();
TEST_ASSERT_EQUAL(TIMER0_ID_MASK, AT91C_BASE_AIC->AIC_ICCR);
}
void testConfigureInterruptShouldEnableCompareInterruptForRegisterC(void)
{
AT91C_BASE_TC0->TC_IER = 0;
Timer_ConfigureInterrupt();
TEST_ASSERT_EQUAL(AT91C_TC_CPCS, AT91C_BASE_TC0->TC_IER);
}
void testEnableInterruptShouldEnableTimer0InterruptsInInterruptCotroller(void)
{
AT91C_BASE_AIC->AIC_IECR = 0;
Timer_EnableInterrupt();
TEST_ASSERT_EQUAL(TIMER0_ID_MASK, AT91C_BASE_AIC->AIC_IECR);
}

View File

@ -0,0 +1,66 @@
#include "unity.h"
#include "Types.h"
#include "TimerInterruptHandler.h"
#include "AT91SAM7X256.h"
AT91S_TC TimerCounter0Peripheral;
void setUp(void)
{
}
void tearDown(void)
{
}
void testSetAndGetSystemTime(void)
{
Timer_SetSystemTime(0);
TEST_ASSERT_EQUAL(0, Timer_GetSystemTime());
Timer_SetSystemTime(129837);
TEST_ASSERT_EQUAL(129837, Timer_GetSystemTime());
Timer_SetSystemTime(UINT32_MAX);
TEST_ASSERT_EQUAL(UINT32_MAX, Timer_GetSystemTime());
}
void testInterruptHandlerShouldIncrementSystemTimeOnlyIfStatusHasCompareRegisterCOverflowBitSet(void)
{
Timer_SetSystemTime(0);
AT91C_BASE_TC0->TC_SR = 0;
Timer_InterruptHandler();
TEST_ASSERT_EQUAL(0, Timer_GetSystemTime());
Timer_SetSystemTime(0);
AT91C_BASE_TC0->TC_SR = ~AT91C_TC_CPCS;
Timer_InterruptHandler();
TEST_ASSERT_EQUAL(0, Timer_GetSystemTime());
Timer_SetSystemTime(0);
AT91C_BASE_TC0->TC_SR = AT91C_TC_CPCS;
Timer_InterruptHandler();
TEST_ASSERT(Timer_GetSystemTime() > 0);
Timer_SetSystemTime(0);
AT91C_BASE_TC0->TC_SR = 0xffffffff;
Timer_InterruptHandler();
TEST_ASSERT(Timer_GetSystemTime() > 0);
}
void testInterruptHandlerShouldIncrementSystemTimerBy_10(void)
{
Timer_SetSystemTime(0);
AT91C_BASE_TC0->TC_SR = AT91C_TC_CPCS;
Timer_InterruptHandler();
TEST_ASSERT_EQUAL(10, Timer_GetSystemTime());
AT91C_BASE_TC0->TC_SR = AT91C_TC_CPCS;
Timer_InterruptHandler();
TEST_ASSERT_EQUAL(20, Timer_GetSystemTime());
Timer_SetSystemTime(39426857);
AT91C_BASE_TC0->TC_SR = AT91C_TC_CPCS;
Timer_InterruptHandler();
TEST_ASSERT_EQUAL(39426867, Timer_GetSystemTime());
}

View File

@ -0,0 +1,18 @@
#include "unity.h"
#include "Types.h"
#include "TimerModel.h"
#include "MockTaskScheduler.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void testUpdateTimeShouldDelegateToTaskScheduler(void)
{
TaskScheduler_Update_Expect(19387L);
TimerModel_UpdateTime(19387L);
}

View File

@ -0,0 +1,21 @@
#include "unity.h"
#include "Types.h"
#include "UsartBaudRateRegisterCalculator.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void testCalculateBaudRateRegisterSettingShouldCalculateRegisterSettingAppropriately(void)
{
// BaudRate = MCK / (CD x 16) - per datasheet section 30.6.1.2 "Baud Rate Calculation Example"
TEST_ASSERT_EQUAL(26, UsartModel_CalculateBaudRateRegisterSetting(48000000, 115200));
TEST_ASSERT_EQUAL(6, UsartModel_CalculateBaudRateRegisterSetting(3686400, 38400));
TEST_ASSERT_EQUAL(23, UsartModel_CalculateBaudRateRegisterSetting(14318180, 38400));
TEST_ASSERT_EQUAL(20, UsartModel_CalculateBaudRateRegisterSetting(12000000, 38400));
TEST_ASSERT_EQUAL(13, UsartModel_CalculateBaudRateRegisterSetting(12000000, 56800));
}

View File

@ -0,0 +1,40 @@
#include "unity.h"
#include "Types.h"
#include "UsartConductor.h"
#include "MockUsartModel.h"
#include "MockUsartHardware.h"
#include "MockTaskScheduler.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void testShouldInitializeHardwareWhenInitCalled(void)
{
UsartModel_GetBaudRateRegisterSetting_ExpectAndReturn(4);
UsartModel_GetWakeupMessage_ExpectAndReturn("Hey there!");
UsartHardware_TransmitString_Expect("Hey there!");
UsartHardware_Init_Expect(4);
UsartConductor_Init();
}
void testRunShouldNotDoAnythingIfSchedulerSaysItIsNotTimeYet(void)
{
TaskScheduler_DoUsart_ExpectAndReturn(FALSE);
UsartConductor_Run();
}
void testRunShouldGetCurrentTemperatureAndTransmitIfSchedulerSaysItIsTime(void)
{
TaskScheduler_DoUsart_ExpectAndReturn(TRUE);
UsartModel_GetFormattedTemperature_ExpectAndReturn("hey there");
UsartHardware_TransmitString_Expect("hey there");
UsartConductor_Run();
}

View File

@ -0,0 +1,77 @@
#include "unity.h"
#include "Types.h"
#include "UsartConfigurator.h"
AT91S_PIO PioAPeripheral;
AT91S_PMC PmcPeripheral;
AT91S_USART Usart0Peripheral;
void setUp(void)
{
}
void tearDown(void)
{
}
void testConfigureUsartIOShouldConfigureUsartTxPinfForPeripheralIO(void)
{
AT91C_BASE_PIOA->PIO_ASR = 0;
AT91C_BASE_PIOA->PIO_BSR = 0xffffffff;
AT91C_BASE_PIOA->PIO_PDR = 0;
Usart_ConfigureUsartIO();
TEST_ASSERT_EQUAL(USART0_TX_PIN, AT91C_BASE_PIOA->PIO_ASR);
TEST_ASSERT_EQUAL(0, AT91C_BASE_PIOA->PIO_BSR);
TEST_ASSERT_EQUAL(USART0_TX_PIN, AT91C_BASE_PIOA->PIO_PDR);
}
void testEnablePeripheralClockShouldEnableClockToUsartPeripheral(void)
{
AT91C_BASE_PMC->PMC_PCER = 0;
Usart_EnablePeripheralClock();
TEST_ASSERT_EQUAL(((uint32)1) << USART0_CLOCK_ENABLE, AT91C_BASE_PMC->PMC_PCER);
}
void testResetShouldDisableAllUsartInterrupts(void)
{
AT91C_BASE_US0->US_IDR = 0;
Usart_Reset();
TEST_ASSERT_EQUAL(0xffffffff, AT91C_BASE_US0->US_IDR);
}
void testResetShouldResetUsartTransmitterAndReceiver(void)
{
AT91C_BASE_US0->US_CR = 0;
Usart_Reset();
TEST_ASSERT_EQUAL(AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS, AT91C_BASE_US0->US_CR);
}
void testConfigureModeShouldSetUsartModeToAsynchronous(void)
{
uint32 asyncMode = (AT91C_US_USMODE_NORMAL |
AT91C_US_NBSTOP_1_BIT |
AT91C_US_PAR_NONE |
AT91C_US_CHRL_8_BITS |
AT91C_US_CLKS_CLOCK);
AT91C_BASE_US0->US_MR = ~asyncMode;
Usart_ConfigureMode();
TEST_ASSERT_EQUAL(asyncMode, AT91C_BASE_US0->US_MR);
}
void testSetBaudRateRegisterShouldSetUsartBaudRateRegisterToValuePassedAsParameter(void)
{
AT91C_BASE_US0->US_BRGR = 0;
Usart_SetBaudRateRegister(3);
TEST_ASSERT_EQUAL(3, AT91C_BASE_US0->US_BRGR);
Usart_SetBaudRateRegister(251);
TEST_ASSERT_EQUAL(251, AT91C_BASE_US0->US_BRGR);
}
void testEnableShouldEnableUsart0Transmitter(void)
{
AT91C_BASE_US0->US_CR = 0;
Usart_Enable();
TEST_ASSERT_EQUAL(AT91C_US_TXEN, AT91C_BASE_US0->US_CR);
}

View File

@ -0,0 +1,37 @@
#include "unity.h"
#include "Types.h"
#include "UsartHardware.h"
#include "AT91SAM7X256.h"
#include "MockUsartConfigurator.h"
#include "MockUsartPutChar.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void testInitShouldConfigureUsartPeripheralByCallingConfiguratorAppropriately(void)
{
Usart_ConfigureUsartIO_Expect();
Usart_EnablePeripheralClock_Expect();
Usart_Reset_Expect();
Usart_ConfigureMode_Expect();
Usart_SetBaudRateRegister_Expect(73);
Usart_Enable_Expect();
UsartHardware_Init(73);
}
void testTransmitStringShouldSendDesiredStringOutUsingUsart(void)
{
Usart_PutChar_Expect('h');
Usart_PutChar_Expect('e');
Usart_PutChar_Expect('l');
Usart_PutChar_Expect('l');
Usart_PutChar_Expect('o');
UsartHardware_TransmitString("hello");
}

View File

@ -0,0 +1,40 @@
#include "unity.h"
#include "Types.h"
#include "UsartModel.h"
#include "ModelConfig.h"
#include "MockTemperatureFilter.h"
#include "MockUsartBaudRateRegisterCalculator.h"
#include <math.h>
void setUp(void)
{
}
void tearDown(void)
{
}
void testGetBaudRateRegisterSettingShouldReturnAppropriateBaudRateRegisterSetting(void)
{
uint8 dummyRegisterSetting = 17;
UsartModel_CalculateBaudRateRegisterSetting_ExpectAndReturn(MASTER_CLOCK, USART0_BAUDRATE, dummyRegisterSetting);
TEST_ASSERT_EQUAL(dummyRegisterSetting, UsartModel_GetBaudRateRegisterSetting());
}
void testGetFormattedTemperatureFormatsTemperatureFromCalculatorAppropriately(void)
{
TemperatureFilter_GetTemperatureInCelcius_ExpectAndReturn(25.0f);
TEST_ASSERT_EQUAL_STRING("25.0 C\n", UsartModel_GetFormattedTemperature());
}
void testShouldReturnErrorMessageUponInvalidTemperatureValue(void)
{
TemperatureFilter_GetTemperatureInCelcius_ExpectAndReturn(-INFINITY);
TEST_ASSERT_EQUAL_STRING("Temperature sensor failure!\n", UsartModel_GetFormattedTemperature());
}
void testShouldReturnWakeupMessage(void)
{
TEST_ASSERT_EQUAL_STRING("It's Awesome Time!\n", UsartModel_GetWakeupMessage());
}

View File

@ -0,0 +1,43 @@
#include "unity.h"
#include "Types.h"
#include "UsartPutChar.h"
#include "MockUsartTransmitBufferStatus.h"
AT91S_USART Usart0Peripheral;
void setUp(void)
{
}
void tearDown(void)
{
}
void testPutCharShouldWriteDesiredCharacterToUsartTransmitBuffer(void)
{
AT91C_BASE_US0->US_THR = 0;
Usart_ReadyToTransmit_ExpectAndReturn(TRUE);
Usart_PutChar('x');
TEST_ASSERT_EQUAL('x', AT91C_BASE_US0->US_THR);
Usart_ReadyToTransmit_ExpectAndReturn(TRUE);
Usart_PutChar('1');
TEST_ASSERT_EQUAL('1', AT91C_BASE_US0->US_THR);
Usart_ReadyToTransmit_ExpectAndReturn(TRUE);
Usart_PutChar(':');
TEST_ASSERT_EQUAL(':', AT91C_BASE_US0->US_THR);
}
void testPutCharShouldWaitUntilReadyToTransmitBeforeLoadingTransmitBufffer(void)
{
AT91C_BASE_US0->US_THR = 0;
Usart_ReadyToTransmit_ExpectAndReturn(FALSE);
Usart_ReadyToTransmit_ExpectAndReturn(FALSE);
Usart_ReadyToTransmit_ExpectAndReturn(FALSE);
Usart_ReadyToTransmit_ExpectAndReturn(TRUE);
Usart_PutChar('x');
TEST_ASSERT_EQUAL('x', AT91C_BASE_US0->US_THR);
}

View File

@ -0,0 +1,22 @@
#include "unity.h"
#include "Types.h"
#include "UsartTransmitBufferStatus.h"
AT91S_USART Usart0Peripheral;
void setUp(void)
{
}
void tearDown(void)
{
}
void testReadyToTransmitShouldReturnStatusPerTransmitBufferReadyStatus(void)
{
AT91C_BASE_US0->US_CSR = 0;
TEST_ASSERT(!Usart_ReadyToTransmit());
AT91C_BASE_US0->US_CSR = AT91C_US_TXRDY;
TEST_ASSERT(Usart_ReadyToTransmit());
}