Termbank
  1. A
    1. Abstraction
    2. Alias
    3. Argument
    4. Array
  2. B
    1. Binary code file
    2. Binary number
    3. Bit
    4. Bitwise negation
    5. Bitwise operation
    6. Byte
  3. C
    1. C library
    2. C-function
    3. C-variable
    4. Character
    5. Code block
    6. Comment
    7. Compiler
    8. Complement
    9. Conditional statement
    10. Conditional structure
    11. Control structure
  4. D
    1. Data structure
    2. Duck typing
  5. E
    1. Error message
    2. Exception
  6. F
    1. Flag
    2. Float
  7. H
    1. Header file
    2. Headers
    3. Hexadecimal
  8. I
    1. Immutable
    2. Initialization
    3. Instruction
    4. Integer
    5. Interpreter
    6. Introduction
    7. Iteroitava
  9. K
    1. Keyword
  10. L
    1. Library
    2. Logical operation
  11. M
    1. Machine language
    2. Macro
    3. Main function
    4. Memory
    5. Method
  12. O
    1. Object
    2. Optimization
  13. P
    1. Parameter
    2. Placeholder
    3. Pointer
    4. Precompiler
    5. Precompiler directive
    6. Prototype
    7. Python console
    8. Python format
    9. Python function
    10. Python import
    11. Python list
    12. Python main program
    13. Python variable
    14. Python-for
    15. Pääfunktio
    16. printf
  14. R
    1. Resource
    2. Return value
  15. S
    1. Statement
    2. Static typing
    3. String
    4. Syntax
  16. T
    1. Terminal
    2. Type
    3. Typecast
  17. U
    1. Unsigned
  18. V
    1. Value
  19. W
    1. Warning
    2. while
Completed: / exercises

Embedded systems

Learning goals:
After studying this material, you will known what are embedded systems, what is the meaning of hardware-oriented programming, what are its main characteristics, and how embedded devices are programmed.

Embedded systems - Why?

Embedded system is a device or a system that is controlled by a computing device and specifically made to perform a dedicated task. In this kind of systems, usually users are aware of the computer device inside of it, even though its existence can be easily deduced. Embedded systems are widely used today in various application areas:
Home appliances, entertainment electronics, smartphones, air conditioning, elevators, …
Hardware-oriented programming, refers to computer programming where programs are developed very close to the computer's hardware, meaning its physical components and parts. This can involve directly controlling the electronic signals that enable different components to function. Nowadays, however, these functionalities are abstracted into layers and existing libraries, making embedded programming significantly easier, as you'll see later in the course.
"Sulautetut järjestelmät töissä"
Embedded systems at work.. and as a hobby. Easier than it seems!

Internet of Things

In the course, we operate in the environment of theIoT. IoT is a global ecosystem of interconnected devices and objects where billions of networked things and devices communicate with each other via the Internet. Nowadays, the Internet of Things has two main perspectives.

The components of an embedded device

An embedded device is a resource-constrained microcomputer designed and functioning specifically for a particular purpose, in contrast to a general-purpose workstation like a home PC. Compared to a PC, an embedded device typically includes only the essential components necessary for its intended use.
The operation of an embedded device generally involves receiving inputs (such as sensor data) related to the behavior of a larger system (e.g., a washing machine or a car) or environmental observations (e.g., greenhouse temperature). The device's program then responds to these inputs based on its programmed logic. For instance, it might analyze simple events (such as exceeding an allowed temperature) based on data from sensors. Often, the program also generates an output (e.g., controlling a larger device using an actuator, like adjusting greenhouse ventilation).
The most visible part of an embedded device for the user is the user interface. Inputs to the device are provided through integrated physical components such as switches (buttons) or a control panel (touchscreen). The device produces responses either on a display (small LCD screen) or through audio signals (speaker) or light indicators (LEDs). However, depending on its purpose, an embedded device may not necessarily have a user interface—for example, when it is integrated into the control system inside a car.
The role of the microcontroller in the embedded device is to handle data processing, acting as the central unit or processor. It executes the program designed for the device.
"Sulautetun laitteen peruskomponentit"
The device may also include mass storage, such as an external SD memory card or non-volatile EEPROM memory for long-term data storage. Of course, an embedded device requires a power source, which, in a mobile device (like a pedometer), is typically a battery or rechargeable cell.
Designers of these devices select the necessary components, considering their physical size, electronic and physical characteristics (sensor measurement range), interfaces, power consumption, programming, and other factors. They create an embedded device where external and internal components are connected to create a functional product. In this video you can see how an embedded device works.

Microcontroller

A microcontroller (also known as a MCU) refers to a single integrated circuit that includes both the CPU and other functional electronic components. The microcontroller in an embedded device corresponds to a computer's microprocessor, but its features are trimmed compared to processors found in home PCs, for example. However, a MCU contains all necessary peripherals necessary to run the computing device including clock, memory and other peripherals (e.g. UART). A microcontroller operates at a low clock frequency and has limited memory, which is further divided into separate program memory (also known as read-only memory, ROM, e.g., Flash memory) and the working memory (also known as random-access memory, RAM) used by programs. Devices often have various types of memory tailored to their specific purposes.
In modern embedded devices, such as smartphones or cars, there are multiple microcontrollers, each performing its own task. For instance, one MCU handles the device's operational logic, another focuses on wireless data transmission, and a third controls the display. This division of labor among microcontrollers enhances the efficiency of the device and its applications by distributing the program's workload across several microcontrollers. Notably, wireless data transmission is a resource-intensive operation in embedded devices, and using a single microcontroller might cause other functions to pause during data transfer

The embedded device of the course

The embedded devices used in the course are:
  1. Texas Instruments' Simplelink SensorTag (which we refer to as SensorTag), offering an excellent view into the current IoT world with its pre-integrated components!
  2. Raspberry Pi Pico W (affectionately known as "Pico"), which provides an excellent perspective on the current IoT world, especially when used with its extension board!

SensorTag

At the heart of the device is a 32-bit microcontroller, which has an integrated wireless radio and its own secondary microcontroller for data transmission. The circuit board of the device is also connected to about ten motion and environment measuring sensors (accelerometer, gyroscope, temperature, light, humidity, and pressure sensors, as well as a magnetometer, compass, and microphone). On the same circuit board, there are also push buttons, LEDs, and a small speaker. External additional components for the device include, for example, a black-and-white LCD display.
The radio integrated into the SensorTag offers several different technologies for wireless data transmission, of which we will use 6LoWPAN technology on the 2.4GHz frequency band in the course (you don't need to know the details of this technology for the course). The teaching staff has implemented a ready-made library for data transmission between devices.
The SensorTag operates (when properly programmed) on a coin battery for up to weeks, thanks to the carefully optimized power consumption of the microcontroller and peripheral components.
As an example, the SensorTag and integrated LCD display could function as a smartwatch!
"SensorTag overview"

Raspberry Pi Pico W

At the heart of the device is a modern RP2040microcontroller with dual cores. The Pico also features an integrated wireless radio and two microcontrollers that handle data transfer via Wi-Fi and Bluetooth. Additionally, the device's extension board includes several sensors for measuring motion and environmental factors (such as acceleration, orientation, temperature, light, humidity, and a microphone). On the same circuit board, you'll find a button, an LED, and a small speaker. The extension board can also accommodate a black-and-white LCD display.
The integrated radio in the Pico supports various technologies for wireless data transfer. In this course, we'll focus on Wi-Fi technology (you don't need to know the details of this technology right now, though). The course staff has already implemented a ready-made library for wireless data transfer.
When properly programmed, the Pico can run on a coin cell battery for weeks, thanks to its minimal power consumption from the microcontroller and peripheral components.
Below is a diagram of the Pico and its pin layout (we'll revisit this later in the course).

Embedded system vs. PC

Compared to general-purpose PC-workstations, embedded system has been developed to work only for a distinct, modest use case. In these applications, the need for computational power, memory and features of the computer is typically minimal. Consequently, it is cost effective to use an embedded device instead of general-purpose PC hardware, which generally can work with low-performance components, which in turn reduces the manufacturing cost of such device. For example, it would be inefficient to use a modern PC to just remotely open a garage door.
Example: The differences between PC and an embedded device from hardware perspective.
Typical PC Embedded device
Clock frequency 2-5GHz 16Mhz - 1GHz
RAM-memory 8-64GB 2kB - 2GB
32kB - 128MB Flash-program memory
Processor 64bit 8bit / 16bit / 32bit / Some 64bit
Mass memory 256GB - 2TB (SSD/HDD) Peripheral device, for example an SD-card
128B - 16MB non-volatile EEPROM/FRAM memory
Plugins Integrated sound card Small buzzer, GPIO pins
Graphics card Small LCD/OLED screen or e-paper display
Keyboard and mouse Button, slider, or a touch screen
In fact, modern PC's use peripheral devices that run their own internal embedded system. Examples of devices like this are a network card or a printer

The design and implementation of an embedded device

Due to the wide range of application areas, use cases, and requirements, designing and implementing embedded devices requires expertise from multiple fields, making it a collaborative effort. In essence, familiarity with the domain - such as medicine or process industries - and understanding the operational context is essential. Additionally, expertise in areas like electronics, computer engineering, software engineering, telecommunications, automation, and even mechanics is typically necessary. Furthermore, when designing devices for consumer markets, experts in user interface design and industrial design also play a crucial role.
From the perspective of computer and software engineering, an embedded device involves designing and implementing the interface between hardware and software, which consists of various electronic and mechanical components. Depending on the application, real-time performance, the predictability of system behavior and responsiveness, the coverage of functions relative to the expected application area are critical. Moreover, fault tolerance and handling error situations are important, as embedded systems often operate autonomously without human intervention. To support the development of embedded systems, specific software engineering and production methods, as well as programming environments, have been created. These often include simulators and/or emulators to verify program correctness during development before prototypes are even deployed to the actual device.
While we won’t delve into software engineering specifics in this course, when programming, we will follow event driven paradigm for our embedded systems. The central idea is to create a program that responds appropriately to events generated by peripheral components (such as button presses, new sensor readings, timing signals, wireless messages, etc.). Event-driven approaches are commonly used in software development, including user interface implementations for web applications.

Running programs

There are significant differences in the execution of programs on a PC and an embedded device. In workstations, programs always run on top of an operating system (such as Windows, Mac OS X, Linux, …), but in embedded systems, there are options based on the purpose and choices made during the design phase.
"Ohjelma sulautetussa laitteessa"
If an embedded device has sufficient resources (such as smartphones) to run an operating system, it is typically a stripped-down version of a PC operating system (for example, various real-time Linux distributions). It provides minimal services for program execution and access to hardware resources.
Sometimes, there is no operating system in embedded devices because the purpose is so simple that it doesn't require operating system services. In such cases, embedded programs are typically implemented on top of firmware. When the device starts up, the firmware initializes first, and other programs start afterward. The firmware connects the components of the embedded device into a functional computer and provides a low-level programming interface for working with components, typically including device drivers and higher-level abstractions to facilitate programming. A well-known example of embedded firmware is the user-friendly Arduino platforms.
When programming embedded systems, the firmware can be compiled as part of the embedded program, or the firmware might already be present in the device's program memory, with only the developer's program being loaded during the programming process. In contrast, in the PC world, the BIOS (or more recently UEFI) primarily serves as low-level firmware that initializes hardware during the boot process and hands control over to the operating system. BIOS/UEFI services are typically not involved in programming tasks once the operating system is running. Instead, the operating system and its drivers handle hardware interactions, and programming is done at the software level using system calls when the software needs to access certain piece of hardware (e.g memory, hard drive, network card). More on that in the Computer Systems course section, for all students who are taking the second part of the course.
It's also possible to implement an embedded application without firmware (so-called bare-metal), but in that case, the programmer needs to create the necessary peripheral interfaces and drivers, including initialization and setup. In bare-metal, programmer needs to control GPIO pins and different registers of the MCU. This naturally requires a deeper understanding of the microcontroller and the electronic operation and control of peripherals. In order to program bare-metal it is necessary to go carefully through the datasheet of the microcontroller or sensor developer is using.
In this course, we'll be creating programs for the Pico and SensorTag on top of a real-time operating system, using manufacturer libraries for assistance. The SDK (Software Development Kit) provided by manufacturers offers pre-implemented services, interfaces, and drivers, so we don't need to create them ourselves—only the functionality required by the application.

Programming an embedded device

When a microcontroller in an embedded device starts up, it automatically begins by executing the firmware. Guided by the firmware, the device initializes itself and its components. After this initialization, the application program stored in the program memory is executed. The application continues to run until the device's power is cut off or a fault occurs. Typically, the program in an embedded device is not changed once it's loaded during manufacturing. Occasionally, there may be a need to update the program, but that can be costly due to reinstallation or even product recalls. However, exceptions exist, especially in devices with sufficient resources to run more advanced operating systems (such as smartphones), allowing third-party programs to execute more freely.
Even today, embedded systems are often programmed using the C programming language (and also its more modern counterpart, C++). Although C was developed in the 1970s, it remains popular for writing efficient, low-level code specifically for embedded systems. C is also a permissive language, allowing programmers to perform many low-level tasks that might not be possible in other languages. Nowadays, RUST is taking traction. However, it is not clear if it can overshadow C in embedded devices.
Programming for embedded devices typically occurs in a PC or workstation environment using development tools provided by the device manufacturers (often available for free). Unlike interpreted languages, embedded systems are generally not programmed interactively, and code cannot be modified on the fly as in, for example, Python interpreters. The process of programming an embedded device involves several steps:
  1. The C program is first compiled using a C compiler on the workstation, translating it into a format that the chosen microcontroller can understand, to its https://en.wikipedia.org/wiki/Machine_code.
  2. The program is then linked with firmware (or a user interface) libraries and drivers, resulting in an executable program. (Due to resource constraints, only necessary drivers are included.)
  3. The combined program is written (flashed) to the embedded device's program memory using a separate programming tool.
  4. During development and testing, the program's execution on the device is controlled using a separate Debugger. Debuggers allow real-time examination of code, program state, and memory contents.
"Ohjelmointiprosessi"
In the picture below, the SensorTag's programming and debugging device (visible circuit board) that we will use in the course. The device is connected to the PC via a USB connector.
"Programming device"
In the course, SensorTag is programmed in the C language using the manufacturer's development environments, primarily in the Code Composer Studio. We will programme the Pico using the C language within a Visual Studio Code-based development environment. We'll leverage the Pico SDK's libraries and drivers to implement our programs.
Detailed instructions for using the software and environment will be covered in the course's lab exercises, so hold off on any installations for now.

Challenges

When designing and programming embedded systems, it’s essential to consider several factors, including:
  1. Microcontrollers often have restricted computational capacity, even though hardware may have strict timing requirements (e.g., in factory applications).
  2. Small memory sizes limit both computation and data transfer capacity.
  3. Embedded systems have limited communication with peripheral devices.
  4. Some devices lack an operating system, while others use highly trimmed-down Real Time Operating Systems
  5. For battery-powered or battery-operated embedded devices, optimizing power consumption is crucial during design.
We'll delve into these topics in more detail in the course material...

To conclude

Embedded system hardware platforms are available for hobbyists to use at home from various major microcontroller manufacturers, typically costing a few tens of euros. The most well-known platform is probably the hobbyist-friendly Arduino, which initiall was based on 8-bit microcontrollers from ATmel but now uses a 32-bit ARM chip. Arduino provides a high-level programming language based on C++, and the goal is to make Arduino programming accessible even for those with limited programming experience. For example, Arduino is used in digital media education. While Arduino is too simplified for our course, having knowledge of its programming can still be beneficial.
It's important not to confuse the Pico with other more complex devices offered by Raspberry Pi (such as the Raspberry Pi 5). These devices have extensive features and resources (for instance, the Raspberry Pi 5 can have up to 8GB of RAM!), making them more like Single Board Computer. Raspberry Pi devices often run Linux operating systems, which would be too heavy for Arduino. Some people don't consider the Raspberry Pi a true embedded system, but it can certainly be embedded in various environments of ubiquitous computing, much like Arduino.
External accessories have been released for the SensorTag through the DevPack interface, which are also openly available online. This means that anyone can create their own additional components for the device, for example, students as part of their bachelor's thesis. You can create also hats or extension boards for the Pico. Just need to follow the pinout.

Additional bibliography

Refer to the course book Embedded Systems
?
Abstraction is a process through which raw machine language instructions are "hidden" underneath the statements of a higher level programming language. Abstraction level determines how extensive the hiding is - the higher the abstraction level, the more difficult it is to exactly say how a complex statement will be turned into machine language instructions. For instance, the abstraction level of Python is much higher than that of C (in fact, Python has been made with C).
Alias is a directive for the precompiler that substitus a string with another string whenever encountered. In it's basic form it's comparable to the replace operation in a text editor. Aliases are define with the #define directeve, e.g. #define PI 3.1416
Argument is the name for values that are given to functions when they are called. Arguments are stored into parameters when inside the function, although in C both sides are often called just arguments. For example in printf("%c", character); there are two arguments: "%c" format template and the contents of the character variable.
Array is a common structure in programming languages that contains multiple values of (usually) the same type. Arrays in C are static - their size must be defined when they are introduced and it cannot change. C arrays can only contain values of one type (also defined when introduced).
Binary code file is a file that contains machine language instructions in binary format. They are meant to be read only by machines. Typically if you attempt to open a binary file in a text editor, you'll see just a mess of random characters as the editor is attempting to decode the bits into characters. Most editors will also warn that the file is binary.
Binary number is a number made of bits, i.e. digits 0 and 1. This makes it a base 2 number system.
A bit is the smallest unit of information. It can have exactly two values: 0 and 1. Inside the computer everything happens with bits. Typically the memory contains bitstrings that are made of multiple bits.
Bitwise negation is an operation where each bit of a binary number is negated so that zeros become ones and vice versa. The operator is ~.
Bitwise operations are a class of operations with the common feature that they manipulate individual bits. For example bitwise negation reverses each bit. Some operations take place between two binary values so that bits in the same position affect each other. These operations include and (&), or (|) and xor (^). There's also shift operations (<< and >>) where the bits of one binary number are shifted to the left or right N steps.
Byte is the size of one memory slot - typically 8 bits. It is the smallest unit of information that can be addressed from the computer's memory. The sizes of variable types are defined as bytes.
External code in C is placed in libraries from which they can be taken to use with the #include directive. C has its own standard libraries, and other libraries can also be included. However any non-standard libraries must be declared to the compiler. Typically a library is made of its source code file (.c) and header file (.h) which includes function prototypes etc.
Functions in C are more static than their Python counterparts. A function in C can only have ne return value and its type must be predefined. Likewise the types of all parameers must be defined. When a function is called, the values of arguments are copied into memory reserved for the function parameters. Therefore functions always handle values that are separate from the values handled by the coe that called them.
C variables are statically typed, which means their type is defined as the variable is introduced. In addition, C variables are tied to their memory area. The type of a variable cannot be changed.
Character is a single character, referred in C as char. It can be interpreted as an ASCII character but can also be used as an integer as it is the smallest integer that can be stored in memory. It's exactly 1 byte. A character is marked with single quotes, e.g. 'c'.
Code block is a group of code lines that are in the same context. For instance, in a conditional structure each condtion contains its own code block. Likewise the contents of a function are in their own code block. Code blocks can contain other code blocks. Python uses indentation to separate code blocks from each other. C uses curly braces to mark the beginning and end of a code block.
Comments are text in code files that are not part of the program. Each language has its own way of marking comments. Python uses the # character, C the more standard //. In C it's also possible to mark multiple lines as comments by placing them between /* and */.
A compiler is a program that transforms C source code into a binary file containing machine language instructions that can be executed by the computer's processor. The compiler also examines the source code and informs the user about any errors or potential issues in the code (warnings). The compiler's behavior can be altered with numerous flags.
Complement is a way to represent negative numbers, used typically in computers. The sign of a number is changed by flipping all its bits. In two's complement which is used in this course, 1 is added to the result after flipping.
Conditional statement is (usually) a line of code that defined a single condition, followed by a code block delimited by curly braces that is entered if the condition evaluates as true. Conditional statements are if statements that can also be present with the else keyword as else if. A set of conditional statements linked together by else keywords are called conditional structures.
Conditional structure is a control structure consisting of one or more conditional statements. Most contrl structures contain at least two branches: if and else. Between these two there can also be any number of else if statements. It is however also possible to have just a single if statement. Each branch in a conditional structure cotains executable code enclosed within a block. Only one branch of the structure is ever entered - with overlapping conditions the first one that matches is selected.
Control structures are code structures that somehow alter the program's control flow. Conditional structures and loops belong to this category. Exception handling can also be considered as a form of control structure.
Data structure is a comman name for collection that contain multiple values. In Python these include lists, tuples and dictionaries. In C the most common data structures are arrays and structs.
Python's way of treating variable values is called dynamic typing aka duck typing. The latter comes from the saying "if it swims like a duck, walks like a duck and quacks like a duck, it is a duck". In other words, the validity of a value is determined by its properties in a case-by-case fashion rather than its type.
An error message is given by the computer when something goes wrong while running or compiling a program. Typically it contains information about the problem that was encountered and its location in the source code.
An exception is what happens when a program encounters an error. Exceptions have type (e.g. TypeError) that can be used in exception handling within the program, and also as information when debugging. Typically exceptions also include textual description of the problem.
Flags are used when executing programs from the command line interface. Flags are options that define how the program behaves. Usually a flag is a single character prefixed with a single dash (e.g. -o) or a word (or multiple words connected with dashes) prefixed with two dashes (e.g. --system. Some flags are Boolean flags which means they are either on (if present) or off (if not present). Other flags take a parameter which is typically put after the flag separated either by a space or = character (e.g. -o hemulen.exe.
Floating point numbers are an approximation of decimal numbers that are used by computers. Due to their archicture computers aren't able to process real decimal numbers, so they use floats instead. Sometimes the imprecision of floats can cause rounding errors - this is good to keep in mind. In C there are two kinds of floating point numbers: float and double, where the latter has twice the number of bits.
Header files use the .h extension, and they contain the headers (function prototypes, type definitions etc.) for a .c file with the same name.
Headers in C are used to indicate what is in the code file. This includes things like function prototypes. Other typical content for headers are definition of types (structs etc.) and constants. Headers can be at the beginning of the code file, but more often - especially for libraries - they are in placed in a separate header (.h) file.
Hexadecimal numbers are base 16 numbers that are used particularly to represent memory addresses and the binary contents of memory. A hexadecimal number is typically prefixed with 0x. They use the letters A-F to represent digits 10 to 15. Hexadecimals are used because each digit represents exactly 4 bits which makes transformation to binary and back easy.
In Python objects were categorized into mutable and immutable values. An immutable value cannot have its contents changed - any operations that seemingly alter the object actually create an altered copy in a new memory location. For instance strings are immutable in Python. In C this categorization is not needed because the relationship of variables and memory is tighter - the same variable addresses the same area of memory for the duration of its existence.
When a variable is given its initial value in code, the process is called initialization. A typical example is the initialization of a number to zero. Initialization can be done alongside with introduction: int counter = 0; or separately. If a variable has not been initialized, its content is whatever was left there by the previous owner of the memory area.
Instruction set defines what instructions the processor is capable of. These instructions form the machine language of the processor architecture.
Integers themselves are probably familiar at this point. However in C there's many kinds of integers. Integer types are distinguished by their size in bits and whether they are signed or not. As a given number of bits can represent up to (2 ^ n) different integers, the maximum value for a signed integer is (2 * (n - 1))
Python interpreter is a program that transforms Python code into machine language instructions at runtime.
The moment a variable's existence is announed for the first is called introduction. When introduced, a variable's type and name must be defined, e.g. int number;. When a variable is introduced, memory is reserved for it even though nothing is written there yet - whatever was in the memory previously is still there. For this reason it's often a good idea to initialize variables when introducing them.
Iteroitava objekti on sellainen, jonka voi antaa silmukalle läpikäytäväksi (Pythonissa for-silmukalle). Tähän joukkoon kuuluvat yleisimpinä listat, merkkijonot ja generaattorit. C:ssä ei ole silmukkaa, joka vastaisi Pythonin for-silmukan toimintaa, joten taulukoiden yms. läpikäynti tehdään indeksiä kasvattavilla silmukoilla.
Keywords are words in programming languages that have been reserved. Good text editors generally use a different formatting for keywords (e.g. bold). Usually keywords are protected and their names cannot be used for variables. Typical keywords include if and else that are used in control structures. In a way keywords are part of the programming language's grammar.
A library is typically a toolbox of functions around a single purpose. Libraries are taken to use with the include directive. If a library is not part of the C standard library, its use must also be told to the compiler.
Logical operation refers to Boole's algebra, dealing with truth values. Typical logical operations are not, and, or which are often used in conditional statements. C also uses bitwise logical operations that work in the same way but affect each bit separately.
Machine language is made of instructions understood by the processor. Machine language is often called Assembly and it is the lowest level where it's reasonable for humans to give instructions to computers. Machine language is used at the latter part of this course - students taking the introduction part do not need to learn it.
Macro is an alias that defines a certain keyword to be replaced by a piece of code. When used well, macros can create more readable code. However, often the opposite is true. Using macros is not recommended in this course, you should just be able to recognize one when you see it.
In C the main function is the starting point when the program is run. The command line arguments of the program are passed on to the main function (although they do not have to be received), and its return value type is int. At its shortest a main function can defined as int main().
When programs are run, all their data is stored in the computer's memory. The memory consists of memory slots with an address and contents. All slots are of equal size - if an instance of data is larger, a continuous area of multiple memory slots is reserved.
Method is a function that belongs to an object, often used by the object to manipulate itself. When calling a method, the object is put before the method: values.sort().
Object is common terminology in Python. Everything in Python is treated as objects - this means that everything can be referenced by a variable (e.g. you can use a variable to refer to a function). Objects are typically used in object-oriented languages. C is not one.
Optimization means improving the performance of code, typically by reducing the time it takes to run the code or its memory usage. The most important thing to understand about opimization is that it should not be done unless it's needed. Optimization should only be considered once the code is running too slowly or doesn't fit into memory. Optimization should also not be done blindly. It's important to profile the code and only optimize the parts that are most wasteful.
A parameter is a variable defined alongside with a function. Parameters receive the values of the function's arguments when it's called. This differentation between parameters and arguments is not always used, sometimes both ends of the value transfer are called arguments.
Placeholders are used in string formatting to mark a place where a value from e.g. a variable will be placed. In Python we used curly braces to mark formatting placeholders. In C the % character is used which is followed by definitions, where the type of the value is mandatory. For instance "%c" can only receive a char type variable.
Pointers in C are special variables. A pointer contains a memory address of the memory location where the actual data value is located. In a sense they work like Python variables. A variable can be defined as a pointer by postfixing its type with * when it's being introduced, e.g. int* value_ptr; creates a pointer to an integer. The contents of the memory address can be fetched by prefixing the variable name with * (e.g. *value_ptr. On the other hand, the address of a memory adress can be fetched by prefixing a variable name with &, (e.g. &value.
The C precompiler is an apparatus that goes through all the precompiler directives in the code before the program is actually compiled. These directives include statements which add the source code of the included libraries into the program, and define directives that can define constant values (aliases) and macros.
Directives are instructions that are addressed at the precompiler. They are executed and removed from the code before the actual compilation. Directives start with the # character. The most common one is include which takes a library into use. Another common one is define, which is used e.g. to create constant values.
Prototype defines a function's signature - the type of its return value, its name and all the arguments. A prototype is separate from the actual function definition. It's just a promise that the function that matches the prototype will be found in the code file. Prototypes are introduced at the beginning of the file or in a separate header file. In common cases the prototype definition is the same as the line that actually starts the function introduction.
Interactive interpreter or Python console is a program where users can write Python code lines. It's called interactive because each code line is executed after its been fully written, and the interpreter shows the return value (if any).
The format method of string in Python is a powerful way to include variable values into printable text. The string can use placeholders to indicate where the format method's arguments are placed.
Python functions can have optional parameters that have a given default value. In Python the values of arguments in a function call are transferred to function parameters through reference, which means that the values are the same even though they may have different names. Python functions can have multiple return values.
In Python the import statement is used for bringing in modules/libraries - either built-in ones, thrid party modules or other parts of the same application. In Python the names from the imported module's namespace are accessible through the module name (e.g. math.sin). In C libraries are taken to use with include, and unlike Python import it brings the library's namespace into the program's global namespace.
Python lists were discovered to be extremely effective tools in Elementary Programming. A Python list is an ordered collection of values. Its size is dynamic (i.e. can be changed during execution) and it can include any values - even mixed types. Lists can also include other lists etc.
In Python main program is the part of code that is executed when the program is started. Usually the main program is at the end of the code file and most of the time under if __name__ == "__main__": if statement. In C there is no main program as such, code execution starts with the main function instead.
In Python a variable is a reference to a value, a connection between the variable's name in code and the actual data in memory. In Python variables have no type but their values do. The validity of a value is tested case by case when code is executed. In these ways they are different from C variables, and in truth Python variables are closer to C pointers.
Pythonin for-silmukka vastaa toiminnaltaan useimmissa kielissä olevaa foreach-silmukkaa. Se käy läpi sekvenssin -esim. listan - jäsen kerrallaan, ottaen kulloinkin käsittelyssä olevan jäsenen talteen silmukkamuuttujaan. Silmukka loppuu, kun iteroitava sekvenssi päättyy.
Pääfunktio on C:ssä ohjelman aloituspiste ja se korvaa Pythonista tutun pääohjelman. Oletuksena pääfunktion nimi on main ja se määritellään yksinkertaisimmillaan int main().
Resource referes to the processing power, memory, peripheral devices etc. that are availlable in the device. It includes all the limitations within which programs can be executed and therefore defines what is possible with program code. On a desktop PC resources are - for a programmer student - almost limitless, but on embedded devices resources are much more scarce.
Return value is what a function returns when its execution ends. In C functions can only have one return value, while in Python there can be multiple. When reading code, return value can be understood as something that replaces the function call after the function has been executed.
A statement is a generic name for a single executable set of instructions - usually one line of code.
C uses static typing This means that the type of variables is defined as they are created, and values of different types cannot be assigned to them. The validity of a value is determined by its type (usually done by the compiler). Python on the other hand uses dynamic typing aka.duck typing.
In Python all text is handled as strings and it has no type for single characters. However in C there are no strings at all - there's only character arrays. A character array can be defined like a string however, e.g. char animal[7] = "donkey"; where the number is the size of the array + 1. The +1 is neede because the string must have space for the null terminator '\0' which is automatically added to the end of the "string".
Syntax is the grammar of a programming language. If a text file does not follow the syntax of code, it cannot be executed as code, or in the case of C, it cannot be compiled.
Terminal, command line interface, command line prompt etc. are different names to the text-based interface of the operating system. In Windows you can start the command line prompt by typing md to the Run... window (Win+R). Command line is used to give text-based commands to the operating system.
The data in a computer's memory is just bits, but variables have type. Type defines how the bits in memory should be interpreted. It also defines how many bits are required to store a value of the type. Types are for instance int, float and char.
Typecast is an operation where a variable is transformed to another type. In the elementary course this was primarily done with int and float functions. In C typecast is marked a bit differently: floating = (float) integer}. It's also noteworthy that the result must be stored in a variable that is the proper type. it is not possible to change the type of an existing variable.
Unsigned integer is a an integer type where all values are interpreted as positive. Since sign bit is not needed, unsigned integers can represent twice as large numbers as signed integers of the same size. An integer can be introduced as unsigned by using the unsigend keyword, e.g. unsigned int counter;.
In the elementary programming course we used the term value to refer to all kinds of values handled by programs be it variables, statement results or anything. In short, a value is data in the computer's memory that can be referenced by variables. In C the relationship between a variable and its value is tighter as variables are strictly tied to the memory area where its value is stored.
A warning is a notification that while executing or - in this course particularly - compiling it, something suspicious was encountered. The program may still work, but parts of it may exhibit incorrect behavior. In general all warnings should be fixed to make the program stable.
One way to print stuff in C is the printf function, which closely resembles Python's print function. It is given a printable string along with values that will be formatted into the string if placeholders are used. Unlike Python, C's printf doesn't automatically add a newline at the end. Therefore adding \n at the end is usually needed.
Out of loops, while is based on repetition through checking a condition - the code block inside the loop is repeated until the loop's condition is false. The condition is defined similarly to conditional statements, e.g. while (sum < 21).