| Commit message (Collapse) | Author | Age |
|
|
|
|
|
|
|
|
|
|
|
| |
The .got section contains global variables an offsets. Specifically it
contains the linker script variables. The linker will automatically put
this section .data, which is not what we want because those values will
not be initialized.
So we put the .got section in flash so the value is initialized.
Without this, there is bizarre behavior on some compilers where linker
variables will be undefined.
|
|
|
|
|
|
|
| |
Specifically this moves the inits into the .text section.
This also move the data and bss segments into sram2 to give the heap and
stack more space to work with in sram1.
|
| |
|
| |
|
| |
|
|
|
|
| |
Turns out each flag needs to be on its own newline. That's so annoying!!
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The linker script was broken because the init_boundaries were
showing the incorrect value. It's fixed now.
Unfortunately there's a bizarre bug where if I add another
klogf() statement in the run_init_routines() function, I lose
_all_ logging. I have no idea what is causing this! The only thing I can
think of in an honsest-to-god complier bug. It probably has to do with
some bizarre-o optimizations GCC is doing. In the time being I had
to shuffle the finishing routines logging to the init() function
directly ... unfortunate.
|
|
|
|
|
|
| |
I tried this before, I swear and it didn't work. Not sure what I did to
make it work this time. I guess that goat I sacrificed appeased the
right gods.
|
|
|
|
|
|
| |
I don't yet know how to configure the the initscript to align the
INIT_DATA_VALUES. Nothing seems to work. But whatever, it seems like
things work and it's a very minor performance hit.
|
|\ |
|
| | |
|
| | |
|
| | |
|
| |
| |
| |
| |
| |
| |
| |
| | |
These headers take inspiration from the linked list and array list
headers as a way to provide primitive templates in C. This time
they implement an AVL tree and Map template (which uses the AVL tree).
Included are relatively robust tests, though they could be improved.
|
| | |
|
| | |
|
| | |
|
|/
|
|
|
|
|
|
|
|
|
|
|
|
| |
The problem was the BSS segment was not aligned with size 4,
thus the routine to clear the BSS segment was infinite looping,
clobbering everything in it's wake until it ran off the memory edge and
caused a hard fault.
This commit does a couple of things.
1. Fixes the alignment issue in the linker script
2. Panics if the bss/data segments are not aligned properly
3. Makes the logging the _first_ thing to initialize. Much easier to
debug that way!
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
instead of 16 (with 8 leading 0's).
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
| |
I also found out that the noise in the lighhts was coming from the USB
debug interface. For whatever reason it doesn't appear that the spi pins
are not well isolated from the debugger noise so unplugging and running
off one power source works pretty well.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
I finally got a stable red/green pattern to show up on the LED strip.
Unfortunately I had to do this manually because my driver is broken. No
Dma, interrupts or drivers, but manually writing to the spi bus.
Currently the driver assums the data sheet doesn't lie and inflates each
bit 3:1 so a 1 is a 110 pattern and a 0 is a 100 pattern. This should be
well within the tolerances at 2.5Mhz, but alas it's not.
I figured out that it's better to inflate each bit to a 4:1 ratio so a 1
is a 1100 pattern and a 0 is a 1000 pattern. This appears to produce
cleaner results.
|
| |
|
|
|
|
|
| |
Before this commit, the heap overlapped with the BSS, which predicatbly
broke everything once trying to use the heap.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Bitfields are officially stupid. Bizzarre behavior was found in how the
bitfields integers were overflowing and causing other members to change
value, causing really screwy behavior. In addition, with the discovery
of 48k being available to the heap, a 12-bit value was no longer
sufficient to define the size.
I rewrote parts of the kalloc code to allow a generic size for the
kalloc header because now it'll require 2 words per block allocated,
and who knows what size the header will be on different platforms
with more memory.
Unfortunately, the second word of the header consists only of the "used"
bool. Because I wish to keep alignmennt with 32-bit words, 31 bits are
"wasted." However, these bits are used as a canary value to detect
heap corruption, so they're not completely wasted.
Also, testing was broken since adding the huge amount of platform
dependent code for doing system calls. These dependent parts were
put under a macro guard so they don't interfere with the x86 testing.
|
| |
|
|
|
|
|
|
|
|
| |
This routine will has a newly allocated stack.
I found out that when using the st-flash utility it likes to reset the
device with the IPSR in HARD FAULT mode (?) so I have to manually hit
the reset button to get it to work.
|
| |
|
| |
|
|
|
|
| |
MPU in main() to actually work.
|
|
|
|
|
|
|
| |
The MPU is a module in arm chips which allow for memory access
protection. They are more primitive than full MMUs, but can still
provide at least basic access control between different process
controls.
|
|
|
|
| |
logging is initialized).
|
|
|
|
| |
linker script.
|
| |
|
| |
|
| |
|
|
|
|
|
|
| |
Removed old iterations of the project and moved the files from 02-usart
to the root directory since that's the sole place where the action is
and that subproject has outgrown its initial title.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Now instead of init() and main() being responsible for all
initialization, individual modules can link in their own
initialization routines.
There are 7 levels for these initializiation routines.
So far these are how the levels are defined
level 0 - Here the world is dark. Nothing is initialized.
This level is responsible for initializing the
system clock.
level 1 - The system clock has been configured, but nothing else. Not
even global variables. This level is responsible for loading
the data sections from flash and clearing the .bss section.
level 2 - USART2 is enabled and set to be the main kernel logging
vehicle. From this point on klogf(...) can be used.
level 3 - The NVIC is reset to point to the flash. From this point
on interrupts can be received. I expect this is where
most core initialization routines will take place
levels 4 to 7 - User initializiation levels.
main - main() is called after all 8 initialization levels have executed,
so in a sense main() is like a 9th initialization level, except
that there is can be only one main() routine whereas there can be
multiple initalization routines per level.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
This gpio subsystem keeps track of the GPIO pins which
have been reserved and takes care of the housekeeping
with keeping them running.
This gpio subsystem also knows which alternate functions
belong to which pins, so it can automatically configure
the pins for the alternate functions.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Before, when running a test binary in --nofork mode, it was up to the
test to reset the program state before exiting to avoid dependencies on
other tests. Now after each test the test harness will:
1. Wipeout the fake environmennt.
2. Reset the data segment to its initialization state.
This achieves reasonable insulation between tests even though certain
things (like a segfault) are stil not practical to completely insulate
without fork()'ing.
|