How to Learn Embedded Systems: A Comprehensive Guide For Beginners

Learning How To Learn Embedded systems can feel daunting, but with the right resources, anyone can succeed. At LEARNS.EDU.VN, we provide comprehensive guidance for aspiring embedded systems developers, offering clear pathways and resources to master this exciting field. Our expert-curated materials cover everything from foundational programming to advanced hardware concepts, ensuring a smooth learning experience.

Looking to dive into microcontrollers, embedded software development, and real-time operating systems? This guide has you covered.

1. What Programming Languages Are Essential to Learn Embedded Systems?

To effectively learn embedded systems, you must be proficient in a range of programming languages. Mastery of C, C++, Assembly, and Python is invaluable for embedded developers.

  • C: C is foundational due to its efficiency and direct hardware access. Dennis Ritchie developed it at Bell Labs between 1969 and 1973. Embedded systems often have resource constraints, making C’s lean nature ideal for writing firmware and device drivers. Its syntax is straightforward, and it offers excellent control over memory management, crucial for optimizing embedded applications.
  • Python: Python’s readability and extensive libraries make it excellent for scripting, testing, and rapid prototyping in embedded environments. Guido van Rossum created it and released it in 1991. Although typically slower than C or C++, Python can significantly accelerate the development process by automating tasks and simplifying complex algorithms.
  • C++: C++ is suitable for developing more complex, object-oriented embedded systems. Bjarne Stroustrup developed it as an extension of the C language, adding object-oriented features. It combines high-level abstractions with low-level control, allowing for reusable, maintainable code. C++ is particularly useful in embedded systems requiring advanced features like sophisticated user interfaces or complex data processing.
  • Assembly Language: Assembly provides the most direct control over hardware but requires a deep understanding of the target architecture. It is a low-level programming language that uses symbolic codes to represent machine instructions. While less frequently used for entire projects, it remains essential for optimizing critical sections of code where performance is paramount, such as interrupt handlers or real-time routines.

Understanding these languages equips you with the necessary tools to tackle diverse challenges in embedded systems development.

2. What Foundational Programming Topics Are Key for Embedded Systems?

Mastering foundational programming topics is crucial for success in embedded systems. Essential skills include data structures, algorithms, operating system concepts, and software testing.

  • Data Structures and Algorithms: A strong grasp of data structures (e.g., linked lists, trees, queues) and algorithms (e.g., sorting, searching) is essential for efficient resource management and optimized performance in embedded systems.
  • Operating System Concepts: Understanding operating system principles such as process management, memory allocation, and concurrency is vital. Real-time operating systems (RTOS) are commonly used in embedded systems to manage tasks and resources effectively, ensuring timely execution of critical operations.
  • Version Control (Git): Version control systems, particularly Git, are indispensable for collaborative software development. Git allows developers to track changes, manage different versions of code, and collaborate efficiently with team members.
  • Debugging: Debugging skills are crucial for identifying and fixing errors in embedded software. Familiarity with debugging tools and techniques, such as using debuggers, logic analyzers, and oscilloscopes, is essential for troubleshooting hardware and software issues.
  • Open Source Development: Understanding open-source development practices and contributing to open-source projects can significantly enhance your skills and knowledge. Open-source projects offer opportunities to learn from experienced developers, collaborate on real-world problems, and gain exposure to different coding styles and architectures.
  • Code Reviews: Participating in code reviews is a valuable practice for improving code quality and identifying potential issues early in the development process. Code reviews involve having other developers examine your code to provide feedback on its correctness, readability, and maintainability.

2.1. Why Are Code Reviews Important in Embedded Systems Development?

Code reviews are crucial in embedded systems development because they improve code quality and identify potential bugs early. Arne Mertz of Simplify C++ has written extensively on this topic. They help ensure that code is readable, maintainable, and adheres to coding standards. Code reviews also promote knowledge sharing among team members, leading to a more robust and reliable codebase.

3. How Do I Get Started with Embedded Systems Hardware?

To begin working with embedded systems hardware, start with microcontrollers and development boards like Arduino or Raspberry Pi. These platforms provide a user-friendly environment for learning the basics of hardware interfacing and programming.

  • Microcontrollers: Microcontrollers are the heart of many embedded systems, integrating a processor, memory, and peripherals on a single chip. Popular microcontrollers include the Arduino Uno (based on the ATmega328P), STM32 series, and ESP32.
  • Development Boards: Development boards provide a convenient platform for experimenting with microcontrollers and building prototype embedded systems. Arduino and Raspberry Pi are popular choices for beginners due to their extensive documentation and active communities.
  • Interfacing with Sensors and Actuators: A fundamental aspect of embedded systems is the ability to interface with sensors and actuators. Sensors convert physical quantities (e.g., temperature, pressure, light) into electrical signals that can be read by the microcontroller, while actuators convert electrical signals into physical actions (e.g., controlling motors, LEDs).
  • Reading Schematics: Understanding electronic schematics is essential for working with embedded hardware. Schematics provide a visual representation of electronic circuits, showing how components are connected. Learning to read schematics allows you to understand the circuit’s functionality and troubleshoot problems effectively.
  • Using an Oscilloscope: An oscilloscope is an essential tool for analyzing electronic signals in embedded systems. It allows you to visualize voltage variations over time, making it useful for debugging hardware issues, measuring signal characteristics, and verifying circuit performance.

3.1. Where Can I Find Hardware Resources for Embedded Systems?

Embedded developers can greatly benefit from resources covering electrical engineering and circuit operation. Websites like All About Circuits and online courses on platforms like Coursera and edX offer comprehensive materials. Practical experience with hardware components and tools is invaluable.

4. What Role Does Firmware Play in Embedded Systems?

Firmware is the software embedded within hardware devices that controls their operation. It acts as an intermediary between the hardware and higher-level software applications.

  • Embedded Software Development: Firmware development involves writing code that directly interacts with the hardware components of an embedded system. This often requires a deep understanding of the microcontroller architecture, peripherals, and memory organization.
  • Device Drivers: Device drivers are software modules that enable communication between the operating system and hardware devices. Writing device drivers is a critical skill for embedded developers, as it allows them to interface with sensors, actuators, and other peripherals.
  • Bootloaders: A bootloader is a small piece of code that runs when an embedded system is powered on. It initializes the hardware and loads the main application firmware into memory. Understanding bootloaders is essential for developing robust and reliable embedded systems.

4.1. What Are Some Useful Blogs and Newsletters for Firmware Development?

Staying current with firmware development trends is essential. Blogs like Embedded Artistry and newsletters such as those from Interrupt provide valuable insights. Participating in forums and communities is also beneficial for problem-solving and knowledge sharing.

5. How Important Are Real-Time Operating Systems (RTOS) in Embedded Systems?

Real-Time Operating Systems (RTOS) are crucial for embedded systems requiring timely and predictable execution of tasks. They manage system resources and provide services for scheduling, inter-process communication, and synchronization.

  • Task Scheduling: RTOS uses scheduling algorithms to determine the order in which tasks are executed. Common scheduling algorithms include priority-based scheduling, round-robin scheduling, and rate-monotonic scheduling.
  • Inter-Process Communication (IPC): IPC mechanisms allow tasks to communicate and share data with each other. Common IPC mechanisms include message queues, semaphores, and mutexes.
  • Memory Management: RTOS manages memory resources to ensure efficient allocation and deallocation of memory blocks. Memory management techniques include static allocation, dynamic allocation, and memory pools.

5.1. Where Can I Find References for RTOS Development?

Online documentation, textbooks, and community forums offer extensive reference materials for RTOS development. Textbooks such as “Real-Time Concepts for Embedded Systems” by Qing Li and Caroline Yao offer comprehensive coverage of RTOS principles and techniques. Online documentation for specific RTOS implementations (e.g., FreeRTOS, Zephyr) provides detailed information on their APIs and usage.

6. What Electrical Engineering Concepts Should Embedded Systems Engineers Know?

Embedded systems engineers should possess a solid foundation in electrical engineering concepts. Essential topics include:

  • Circuit Analysis: Understanding circuit laws (e.g., Ohm’s Law, Kirchhoff’s Laws) and circuit analysis techniques (e.g., nodal analysis, mesh analysis) is essential for designing and troubleshooting electronic circuits.
  • Electronics Components: Familiarity with common electronic components (e.g., resistors, capacitors, inductors, diodes, transistors) and their characteristics is necessary for selecting appropriate components for embedded systems.
  • Signal Integrity: Signal integrity refers to the quality of electrical signals in a circuit. Understanding signal integrity principles is crucial for designing reliable embedded systems, especially at high frequencies.
  • Power Electronics: Power electronics deals with the conversion and control of electrical power. Embedded systems engineers should have knowledge of power supply design, voltage regulation, and power management techniques.

6.1. What Are Some Helpful Rules of Thumb for Electrical Engineering?

Rules of thumb can provide quick estimates and guidelines for circuit design and analysis. For example, the voltage drop across a forward-biased silicon diode is approximately 0.7V. Keeping track of such rules can expedite the design process and help in quick troubleshooting.

7. How Does Product Development Relate to Embedded Systems?

Product development involves taking an embedded system from initial concept to a finished product ready for market. This includes:

  • Prototyping: Building a prototype is an essential step in product development. It allows you to test the functionality of the embedded system and identify potential design flaws.
  • Testing: Rigorous testing is necessary to ensure that the embedded system meets the required specifications and performance criteria. Testing methods include unit testing, integration testing, and system testing.
  • Manufacturing: Once the design is finalized, the embedded system needs to be manufactured. This involves selecting appropriate manufacturing processes, sourcing components, and assembling the product.

7.1. What Websites Offer Resources for Product Design and Manufacturing?

Websites like Kickstarter and Indiegogo offer valuable resources for product design and manufacturing. These platforms provide opportunities to learn from successful projects, connect with manufacturers, and raise funding for your product.

8. What Are Some Recommended Videos for Learning Embedded Systems?

Video tutorials can be an effective way to learn about embedded systems. YouTube channels like the one from LEARNS.EDU.VN offer curated playlists covering programming, hardware, and real-time operating systems.

8.1. Where Can I Find Lectures on Embedded Systems?

Lectures from universities and educational institutions can provide in-depth knowledge of embedded systems. For example, James M. Conrad’s lectures at the University of North Carolina at Charlotte offer a comprehensive introduction to the topic. Miro Samek’s Modern Embedded Systems Programming Course is also an excellent resource for learning about real-time systems.

9. What Career Guidance Can Help Me Succeed in Embedded Systems?

Career guidance is essential for building a successful career in embedded systems. This includes:

  • Networking: Networking with other professionals in the field can provide valuable insights and opportunities. Attending industry conferences, joining online communities, and participating in open-source projects are excellent ways to expand your network.
  • Continuous Learning: The field of embedded systems is constantly evolving, so it is essential to stay updated with the latest technologies and trends.
  • Resume Building: A well-crafted resume can help you stand out from other candidates. Highlight your skills, experience, and accomplishments in embedded systems development.
  • Interview Preparation: Preparing for interviews is crucial for landing your dream job. Practice answering common interview questions, and be ready to discuss your projects and technical skills.

9.1. What Resources Offer Career Advice for Engineers?

“The Unwritten Laws of Engineering” by W.J. King and James G. Skakoon offers valuable insights into the professional aspects of engineering. This book provides guidance on career development, ethics, and workplace dynamics.

10. What Books Are Highly Recommended for Learning Embedded Systems?

Reading books is a great way to deepen your understanding of embedded systems. Several books are highly recommended:

  • “Making Embedded Systems: Design Patterns for Great Software” by Elecia White: This book offers a practical approach to embedded software development using design patterns.
  • “Designing Embedded Hardware: Create New Computers and Devices” by John Catsoulis: This book provides a comprehensive guide to designing embedded hardware.
  • “Real-Time Concepts for Embedded Systems” by Qing Li and Caroline Yao: This book covers the fundamental concepts of real-time operating systems.

10.1. Why Are These Books So Valuable?

These books offer a combination of theoretical knowledge and practical guidance, making them invaluable resources for both beginners and experienced professionals in embedded systems. They provide in-depth coverage of essential topics and offer practical advice for solving real-world problems.

11. How to Learn Embedded Systems: A Detailed Step-by-Step Guide

Learning embedded systems can seem complex. Here’s a structured approach to guide you:

Step 1: Build a Strong Foundation

  • Mathematics: Strengthen your understanding of calculus, linear algebra, and differential equations, essential for algorithm design and analysis.
  • Electronics: Gain a solid grasp of basic electronics, circuit theory, and digital logic design.
  • Computer Architecture: Learn about computer organization, memory management, and microprocessor architecture.

Step 2: Master Programming Languages

  • C: Start with C, focusing on memory management, pointers, and data structures.
  • C++: Move to C++ to utilize object-oriented programming for modular and reusable code.
  • Assembly: Understand assembly language for low-level hardware control and optimization.
  • Python: Use Python for scripting, testing, and rapid prototyping.

Step 3: Dive Into Microcontrollers

  • Choose a Platform: Select a microcontroller platform like Arduino, STM32, or ESP32.
  • Explore Peripherals: Learn about timers, UART, SPI, I2C, and ADC.
  • Hands-On Projects: Start simple projects like blinking LEDs, reading sensor data, and controlling motors.

Step 4: Understand Real-Time Operating Systems (RTOS)

  • RTOS Concepts: Learn about task scheduling, inter-process communication, and memory management in RTOS.
  • Choose an RTOS: Experiment with FreeRTOS, Zephyr, or other RTOS platforms.
  • Implement Projects: Implement RTOS-based projects to understand real-time task management.

Step 5: Explore Hardware Interfacing

  • Sensors and Actuators: Interface with different sensors and actuators to build interactive systems.
  • Schematics: Learn to read and design electronic schematics.
  • Tools: Become proficient with tools like oscilloscopes and logic analyzers for debugging.

Step 6: Focus on Embedded Linux

  • Linux Kernel: Understand the Linux kernel and its role in embedded systems.
  • Device Drivers: Learn to write device drivers for custom hardware.
  • Build Systems: Use build systems like Yocto to create custom Linux distributions.

Step 7: Learn About Communication Protocols

  • Wired Protocols: Understand Ethernet, CAN, and USB.
  • Wireless Protocols: Learn about Wi-Fi, Bluetooth, Zigbee, and LoRaWAN.

Step 8: Master Debugging and Testing

  • Debugging Tools: Learn to use debuggers like GDB for embedded systems.
  • Testing Techniques: Implement unit testing, integration testing, and system testing.
  • Code Analysis: Use static and dynamic code analysis tools.

Step 9: Understand Security Considerations

  • Secure Coding: Follow secure coding practices to prevent vulnerabilities.
  • Cryptography: Learn about encryption and authentication techniques.
  • Hardware Security: Understand hardware security features like secure boot and secure storage.

Step 10: Develop Product Development Skills

  • Prototyping: Build and iterate on prototypes using 3D printing and PCB design.
  • Manufacturing: Understand manufacturing processes, supply chain management, and component sourcing.
  • Testing and Certification: Learn about regulatory requirements and certification processes.

Step 11: Engage in Continuous Learning

  • Stay Updated: Keep up with the latest technologies and trends through blogs, conferences, and online courses.
  • Community: Participate in online communities and open-source projects.
  • Advanced Topics: Explore advanced topics like machine learning for embedded systems, IoT, and robotics.

12. What Are Some Advanced Tips for Learning Embedded Systems?

Here are some advanced tips for those looking to excel:

  • Practice Regularly: Consistent practice is critical. Dedicate time each day to work on projects and exercises.
  • Join Communities: Engage with online forums, attend local meetups, and participate in open-source projects to learn from others.
  • Read Source Code: Study the source code of popular embedded libraries and operating systems to understand best practices.
  • Contribute to Open Source: Contributing to open-source projects is a great way to gain experience and build your portfolio.
  • Build a Portfolio: Create a portfolio of projects to showcase your skills and experience to potential employers.

13. Why is Understanding Embedded Systems Security Important?

Understanding embedded systems security is increasingly important due to the proliferation of IoT devices and the potential for cyber-attacks. Embedded systems are used in critical infrastructure, automotive, healthcare, and consumer electronics, making them attractive targets for malicious actors.

  • Vulnerabilities: Embedded systems often have vulnerabilities due to insecure coding practices, lack of security updates, and limited resources.
  • Attack Vectors: Attack vectors include malware, software exploits, and physical attacks.
  • Security Measures: Security measures include secure boot, secure storage, encryption, and authentication.

14. What are the Key Aspects of Low-Power Design in Embedded Systems?

Low-power design is a critical aspect of embedded systems, especially for battery-powered devices. Techniques include:

  • Clock Gating: Disabling the clock signal to inactive modules to reduce power consumption.
  • Voltage Scaling: Reducing the supply voltage to reduce power consumption.
  • Power Modes: Using different power modes (e.g., sleep, deep sleep) to conserve energy.
  • Efficient Algorithms: Implementing energy-efficient algorithms and data structures.

15. How Can I Stay Updated with the Latest Trends in Embedded Systems?

Staying updated with the latest trends in embedded systems is crucial for career growth and innovation. Methods include:

  • Blogs and Newsletters: Follow industry blogs and newsletters to stay informed about new technologies and trends.
  • Conferences: Attend conferences and workshops to learn from experts and network with other professionals.
  • Online Courses: Take online courses to learn about new technologies and tools.
  • Research Papers: Read research papers to understand the latest advances in embedded systems.

16. What are Some Common Mistakes to Avoid When Learning Embedded Systems?

  • Skipping Fundamentals: Ensure a solid understanding of basic programming concepts before moving to advanced topics.
  • Neglecting Hardware: Don’t overlook the importance of understanding hardware components and circuit design.
  • Ignoring Documentation: Always refer to the documentation for microcontrollers, peripherals, and software libraries.
  • Not Testing Thoroughly: Thoroughly test your code and hardware to identify and fix bugs early.
  • Not Seeking Help: Don’t hesitate to ask for help from online communities and experienced developers.

17. How do I Choose the Right Microcontroller for My Project?

Selecting the right microcontroller depends on the specific requirements of your project. Consider the following factors:

  • Performance: Select a microcontroller with sufficient processing power for your application.
  • Memory: Ensure the microcontroller has enough Flash and RAM for your code and data.
  • Peripherals: Choose a microcontroller with the necessary peripherals (e.g., timers, UART, SPI, I2C, ADC).
  • Power Consumption: Select a microcontroller with low power consumption for battery-powered devices.
  • Cost: Consider the cost of the microcontroller and development tools.
  • Community Support: Choose a microcontroller with a strong community and extensive documentation.

18. What is the Difference Between Bare-Metal Programming and Using an RTOS?

Bare-metal programming involves writing code that directly interacts with the hardware without an operating system. It offers maximum control and efficiency but can be complex for larger projects. Using an RTOS provides a structured framework for managing tasks and resources, making it easier to develop complex embedded systems.

  • Bare-Metal Programming:
    • Pros: Maximum control, high efficiency.
    • Cons: Complex for large projects, difficult to manage tasks.
  • Using an RTOS:
    • Pros: Simplified task management, improved code organization.
    • Cons: Overhead, reduced control.

19. How Can I Optimize Code for Embedded Systems?

Optimizing code for embedded systems involves reducing memory usage, improving performance, and minimizing power consumption. Techniques include:

  • Efficient Data Structures: Use appropriate data structures to minimize memory usage and improve performance.
  • Loop Optimization: Optimize loops to reduce execution time.
  • Inline Functions: Use inline functions to reduce function call overhead.
  • Fixed-Point Arithmetic: Use fixed-point arithmetic instead of floating-point arithmetic to improve performance.
  • Compiler Optimization: Enable compiler optimization flags to generate efficient code.

20. What is the Role of Digital Signal Processing (DSP) in Embedded Systems?

Digital Signal Processing (DSP) is used in embedded systems to process and analyze signals such as audio, video, and sensor data. Key DSP concepts include:

  • Sampling: Converting analog signals to digital signals.
  • Filtering: Removing noise and unwanted frequencies from signals.
  • Fourier Transforms: Analyzing the frequency content of signals.
  • Convolution: Combining signals to produce new signals.

21. How to Learn Embedded Systems and Prepare for Certification

Pursuing certifications can greatly enhance your credibility and expertise in embedded systems. Here’s how to prepare effectively:

Choose the Right Certification

Research and select certifications that align with your career goals and expertise. Popular certifications include:

  • ARM Accredited Engineer (AAE): Validates proficiency in ARM technology.
  • Certified Embedded Systems Professional (CESP): Offered by the Embedded Systems Academy, focusing on embedded systems design and development.
  • National Instruments Certified LabVIEW Developer (CLD): Focuses on using LabVIEW for embedded applications.

Assess Your Knowledge

Before starting your preparation, assess your current knowledge and identify areas where you need to improve. This will help you focus your study efforts.

Study Resources

Utilize a variety of study resources to prepare for the certification exam:

  • Official Study Guides: Use official study guides provided by the certification body.
  • Online Courses: Enroll in online courses that cover the exam topics.
  • Textbooks: Refer to textbooks for in-depth coverage of embedded systems concepts.
  • Practice Exams: Take practice exams to simulate the actual exam environment and assess your readiness.

Hands-On Experience

Gain hands-on experience by working on projects and experiments related to the exam topics. This will help you understand the practical aspects of embedded systems.

Join Study Groups

Join study groups or online forums to connect with other candidates and share knowledge and resources.

Create a Study Plan

Develop a structured study plan that covers all the exam topics and allocates sufficient time for each topic.

Practice Regularly

Practice regularly by solving problems and working on projects. This will help you build confidence and improve your problem-solving skills.

Review and Revise

Regularly review and revise the topics you have studied to reinforce your knowledge and identify areas where you need to improve.

Stay Updated

Stay updated with the latest developments in embedded systems technology by reading blogs, attending conferences, and participating in online communities.

Take the Exam

Once you feel confident and prepared, schedule and take the certification exam.

22. FAQ: How to Learn Embedded Systems

Q1: What is an embedded system?

An embedded system is a specialized computer system designed to perform specific tasks within a larger device or system, such as controlling appliances, vehicles, or industrial machinery.

Q2: Why should I learn embedded systems?

Learning embedded systems opens up diverse career opportunities in industries like automotive, aerospace, healthcare, and consumer electronics, offering the chance to work on innovative technologies.

Q3: What are the basic requirements for learning embedded systems?

The basic requirements include a strong foundation in mathematics, electronics, computer architecture, and proficiency in programming languages like C and C++.

Q4: Which programming languages are most commonly used in embedded systems?

The most commonly used programming languages are C, C++, Assembly, and Python. C is favored for its efficiency and low-level control, while C++ is used for more complex systems.

Q5: What hardware knowledge is essential for embedded systems?

Essential hardware knowledge includes understanding microcontrollers, sensors, actuators, circuit design, and the ability to read schematics.

Q6: What are real-time operating systems (RTOS) and why are they important?

RTOS are operating systems designed for real-time applications, ensuring timely and predictable execution of tasks. They are crucial for systems requiring precise timing, such as industrial control systems and robotics.

Q7: How can I get started with embedded systems development?

Start with beginner-friendly platforms like Arduino or Raspberry Pi, explore basic electronics and programming, and gradually work on more complex projects.

Q8: What are some common challenges in embedded systems development?

Common challenges include resource constraints (memory, processing power), real-time requirements, power consumption, and security vulnerabilities.

Q9: How can I stay updated with the latest trends in embedded systems?

Stay updated by following industry blogs, attending conferences, participating in online communities, and taking online courses.

Q10: What are some good resources for learning embedded systems?

Good resources include official documentation, textbooks, online courses, community forums, and YouTube channels like LEARNS.EDU.VN.

Conclusion

Learning embedded systems is a rewarding journey that requires dedication and continuous learning. By following the steps and tips outlined in this guide, you can build a strong foundation, develop essential skills, and excel in this exciting field. Remember to practice regularly, stay updated with the latest trends, and seek help from online communities and experienced developers. With the right resources and mindset, you can unlock endless possibilities in embedded systems.

Ready to take your embedded systems knowledge to the next level? Visit LEARNS.EDU.VN today to explore our extensive collection of articles and courses designed to help you master embedded software development, microcontroller programming, and real-time operating systems. Whether you’re looking for in-depth tutorials, practical tips, or expert guidance, learns.edu.vn has everything you need to succeed. Don’t wait – start your journey toward becoming an embedded systems expert now. Contact us at 123 Education Way, Learnville, CA 90210, United States, Whatsapp: +1 555-555-1212.

Alt text: Arduino Uno R3 microcontroller board, a popular choice for beginners in embedded systems, showcasing its various components and interfaces.

Alt text: Surface Mount Device (SMD) components on a PCB, essential for understanding electronics in embedded systems and showcasing miniature electronic components.

Alt text: Oscilloscope display showing a waveform, essential for debugging and analyzing electrical signals in embedded systems.

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *