I am sure most of this has been said before but here goes..
I think it would be extremely useful for novices (and some experienced old hands too) to delve into doing some proper embedded microcontroller software development *first* before trying to understand all of the information scattered on here.
Having spent decades working in the industrial automation and embedded devices in general with plenty of hands-on experience of so many different architectures I can say it really does help, a lot. Many concepts are verbatim carry over. What is extremely useful is that you'll see many of the things described in terms of hardware are pretty much identical concepts on other controllers too. You really need to understand terms like GPIO, SPI, I2C, ADC, PWM, DAC, CAN, UART Serial, DMA, EEPROM, Flash, etc. etc. Many of these things are just implemented differently due to the quirks and specifics of these 20+ year old designs), they are all. I would also strongly recommend getting a development board that supports an open source RTOS (Real time operating System) and get to grips with all of the concepts. They are used throughout ME7 code because Bosch acquired a company, ETAS whom did a lot of the ME7 hard real-time requirements work using ERCOS (Embedded Real-time Control Operating System). Its basically an automotive RTOS so any experience of a RTOS will come in extremely useful.
Its worth realizing that Bosch didn't really design the architecture of the hardware used for any of their ME7's ecu's. It was imposed upon them when they chose to use a pair of inexpensive 16-Bit Siemens microcontroller of the day, the C16x family of microcontrollers. Later rights acquired by ST and Infineon at various stages before they became end of life. In fact Bosch hardware designers basically used what is called a ' reference design ' in Industry terminology and tweaked it to their needs. Back in the day Bosch also acquired other chip designs (or licensed them) and had them re-badged with their own brand but many are in fact common parts adapted or simply rebranded in some cases.
So for instance Throttle bodies are controlled via PWM (Pulse Wave Modulation) which in turn go into an external 'H-Bridge chip' to drive the current required for a high powered DC-Motor control. Since Bosch licensed many of these chips (as they knew they'd be manufacturing millions of them, so it made sense) you'll often find them described with strange non standard descriptions
If your extremely lucky you can still find the occasional development board become available on ebay which is extremely useful to learn with. However even if you cannot find the same processor just playing with a 16-bit embedded controller will teach you so many concepts and these will allow you to understand far better a lot of the underlying areas of confusion often expressed here time again.
On the various term's. There is a lot of confusion but quite simply put...
ROM - Read ONLY Memory
RAM - Random Access Memory.
FLASH - Read only Memory that persists a power off state. While being read only in normal state is typical, it can be re-programmed electrically using a specially timed sequence of commands and control logic. This is called 'reflashing' or 'reprogramming'.
OTP - One Time Programmable Memory. Once its programmed its burned, normally a the chip level by blowing an internal fuse which locks its state so it cannot be altered again after factory programming. Often these are faked on modern controllers so if you know the unlock codes you can infact re-program OTP but that's a different discussion altogether
In the ME7 world there is some confusion as people use the terms ROM and Flash interchangeably. Actually this may have come from the fact that different 'strains' of the C167's came shipped with different variants of configuration and also its common to refer to 'Boot ROM'. Some C167's have OTP but also there are Flashable versions too. You can see what model you have by looking at the datasheet to understand the letters after the chip designation. e.g. C167SR (etc.).
Here's where it gets a little bit more complex on the ME7x's...
You have multiple types of Storage AND multiple types of RAM too (i.e. memory that's bit states do not persist after power is lost, the data and code needs to be reloaded every power up). Each different type of ram also comes with its own address maps (i.e ranges of addresses where its state is accessed and stored.). Understanding the difference between IRAM (Internal RAM) and External RAM (XRAM) is vital to understanding too. Again just like for flash the microcontroller was designed with a small amount of internal ram fitted but its so small that to accomplish something as complex as ME7 required additional ram fitting.
Lets describe them;
INTERNAL Flash (Also referenced as Boot ROM but in theory you could put your entire app inside Internal flash provided it could fit!). Its internal to the Microcontroller so not on external pins. Different versions have different sizes depending on the requirements at the time of manufacture.
EXTERNAL Flash (Separate to the Micro controller and often much larger than the internal Flash).
On the C167's they only supported 32Kbytes of Internal flash which wasn't enough to store the large quantity of code space required to implement all of the self tests and standards.
From a software perspective, apart from RTOS and GPIO, along with the various drivers like SPI, I2C, etc. I would also learn about KWP2000 protocol and J1979 Diagnostics, McMess and plethora of P-Code mandated Self Tests. From my experience of looking at the Bosch code I would argue easily 80% of the code is self tests, etc. You could probably control the sensors and actuators with significantly less complicated software but the majority of the code is indeed all the standards it needed to implement such as OBD KWP Smog tests etc.
If you really want some good advice I would experiment with Arduino, then advance on to using an STM32 Microcontroller with C and assembly drivers and learn about all how to control all the sensors and actuators found in your vehicle. Once you know how all of this stuff works you can then begin to understand the code itself.