Skip to content

Repository files navigation

C++ cortex-m hardware library

klib library

Klib uses cmake and arm-none-eabi-gcc to build excecutables for cortex targets. Currently supported targets can be found in the target folder.

Support for devices varies. Currently some targets have a startup file that can be enabled by uncommenting line 6 in the project CMakeLists (project/CMakeLists.txt). This means by default the coprocessors are not enabled and the cpu clock may not be initialized to the full clock speed.


Starting your first project

The easiest way to start a your first project is using Github codespaces. Github codespaces will download all the required programs and will generate the required header files for all supported microcontrollers. If you want to create a project on your own machine the header files need to be generated manually (this can be done using the CMSIS 'svdconv' utility). The header files should be placed in the targets/chip/target folder with the same name as the target folder. Another way to get the header files is to start a github codespace and download the required headers when it is done converting all the svd files to headers.

For example the svd files for the LPC1756 can be generated using:

svdconv.exe lpc1756.svd --generate=header

The output of the svdconv utility needs to be moved to: targets/chip/lpc1756/lpc1756.h

Selecting target cpu

To select a target cpu the target cpu needs to be added to the commandline when configuring cmake.

(e.g. To configure cmake for the max32660, run the following command)

cmake -B ./build -DTARGET_CPU=max32660

This configures the project for the specific target cpu. To change to a different target, the project has to be reconfigured.

Setup VSCode

(When using vscode with the cmake plugin the following can be added to the settings.json to configure cmake for the max32660 evsys board)

{
// target cpu, should be the same as in the cmake // define this is used in the c_cpp_properties.json // for intellisense"target_cpu": "atsam4s2b",
// target cpu to use when using launch.json// note: this might be different from the define. // for example the "atsam4s2b" does not exist in// the j-link software and requires us to use // "atsam4s2ba" instead. To find the correct name// open j-link and search for your chip"target_cpu_debug": "atsam4s2ba",
"cmake.configureSettings": {
"TARGET_CPU": "atsam4s2b",
"TARGET_LOW_POWER_SLEEP": "1",
"TARGET_BREAK_AT_RESERVED_HANDLER": "1"
},
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
}

Main file

By default klib has no main.cpp file. This has to be created by the user. To use the klib target system klib.hpp needs to be included.

Minimal main file:

#include<klib/klib.hpp>intmain() {
return0;
}

Examples

Another way to start a project is using one of the following examples:

2 factor authenticator dongle

mouse jiggler

Constructors before running main

C++ supports global constructors for objects. These objects will be constructed before main is executed. This is supported by klib. If you want to initialize hardware before these global constructors are called you need to add the attribute __attribute__((__constructor__(x))) to your function definition where x is a number above 102 (the first 100 are reserved by gcc, 101 is reserved for startup code by klib and 102 is reserved for a secondary startup code by klib). This will make sure your function will be executed before any constructor is called.


Using klib

Klib has most library functions documented using doxygen (there is no config file). Please refrence the doxygen/doxywizzard documentation to generate the documentation.

Interrupt handling

By design klib has a default vector table that should not be changed. Instead one of the 3 vector table implementations should be used.

Klib has the following implementations:

  • Ram based vector table (used by default)
  • Ram based vector table with entry and exit hooks (uses more ram and flash than the default implementation)
  • Flash/custom vector table (allows a vector table stored in flash or for a custom ram based implementation)

When chosing one of the ram based vector table implementations all the code works by default as this allows the code to change the interrupt at runtime. When chosing the flash/custom vector table the user needs to create the vector table and pass it to the flash based vector table implementation. With this implementation the interrupts are not configured automaticly when needed and need to be changed by the user to the correct callback/handler. For more information about the different implementations see irq.hpp as a reference.

Tests

Klib has tests for the microcontroller indepented code. The resuls of the tests can be found here

About

Embedded hardware (arm cortex) library to use with cmake and (arm-none-eabi-)gcc

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - itzandroidtab/klib: Embedded hardware (arm cortex) library to use with cmake and (arm-none-eabi-)gcc · GitHub
Skip to content

Repository files navigation

C++ cortex-m hardware library

klib library

Klib uses cmake and arm-none-eabi-gcc to build excecutables for cortex targets. Currently supported targets can be found in the target folder.

Support for devices varies. Currently some targets have a startup file that can be enabled by uncommenting line 6 in the project CMakeLists (project/CMakeLists.txt). This means by default the coprocessors are not enabled and the cpu clock may not be initialized to the full clock speed.


Starting your first project

The easiest way to start a your first project is using Github codespaces. Github codespaces will download all the required programs and will generate the required header files for all supported microcontrollers. If you want to create a project on your own machine the header files need to be generated manually (this can be done using the CMSIS 'svdconv' utility). The header files should be placed in the targets/chip/target folder with the same name as the target folder. Another way to get the header files is to start a github codespace and download the required headers when it is done converting all the svd files to headers.

For example the svd files for the LPC1756 can be generated using:

svdconv.exe lpc1756.svd --generate=header

The output of the svdconv utility needs to be moved to: targets/chip/lpc1756/lpc1756.h

Selecting target cpu

To select a target cpu the target cpu needs to be added to the commandline when configuring cmake.

(e.g. To configure cmake for the max32660, run the following command)

cmake -B ./build -DTARGET_CPU=max32660

This configures the project for the specific target cpu. To change to a different target, the project has to be reconfigured.

Setup VSCode

(When using vscode with the cmake plugin the following can be added to the settings.json to configure cmake for the max32660 evsys board)

{
// target cpu, should be the same as in the cmake // define this is used in the c_cpp_properties.json // for intellisense"target_cpu": "atsam4s2b",
// target cpu to use when using launch.json// note: this might be different from the define. // for example the "atsam4s2b" does not exist in// the j-link software and requires us to use // "atsam4s2ba" instead. To find the correct name// open j-link and search for your chip"target_cpu_debug": "atsam4s2ba",
"cmake.configureSettings": {
"TARGET_CPU": "atsam4s2b",
"TARGET_LOW_POWER_SLEEP": "1",
"TARGET_BREAK_AT_RESERVED_HANDLER": "1"
},
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
}

Main file

By default klib has no main.cpp file. This has to be created by the user. To use the klib target system klib.hpp needs to be included.

Minimal main file:

#include<klib/klib.hpp>intmain() {
return0;
}

Examples

Another way to start a project is using one of the following examples:

2 factor authenticator dongle

mouse jiggler

Constructors before running main

C++ supports global constructors for objects. These objects will be constructed before main is executed. This is supported by klib. If you want to initialize hardware before these global constructors are called you need to add the attribute __attribute__((__constructor__(x))) to your function definition where x is a number above 102 (the first 100 are reserved by gcc, 101 is reserved for startup code by klib and 102 is reserved for a secondary startup code by klib). This will make sure your function will be executed before any constructor is called.


Using klib

Klib has most library functions documented using doxygen (there is no config file). Please refrence the doxygen/doxywizzard documentation to generate the documentation.

Interrupt handling

By design klib has a default vector table that should not be changed. Instead one of the 3 vector table implementations should be used.

Klib has the following implementations:

  • Ram based vector table (used by default)
  • Ram based vector table with entry and exit hooks (uses more ram and flash than the default implementation)
  • Flash/custom vector table (allows a vector table stored in flash or for a custom ram based implementation)

When chosing one of the ram based vector table implementations all the code works by default as this allows the code to change the interrupt at runtime. When chosing the flash/custom vector table the user needs to create the vector table and pass it to the flash based vector table implementation. With this implementation the interrupts are not configured automaticly when needed and need to be changed by the user to the correct callback/handler. For more information about the different implementations see irq.hpp as a reference.

Tests

Klib has tests for the microcontroller indepented code. The resuls of the tests can be found here

About

Embedded hardware (arm cortex) library to use with cmake and (arm-none-eabi-)gcc

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - itzandroidtab/klib: Embedded hardware (arm cortex) library to use with cmake and (arm-none-eabi-)gcc · GitHub
Skip to content

Repository files navigation

C++ cortex-m hardware library

klib library

Klib uses cmake and arm-none-eabi-gcc to build excecutables for cortex targets. Currently supported targets can be found in the target folder.

Support for devices varies. Currently some targets have a startup file that can be enabled by uncommenting line 6 in the project CMakeLists (project/CMakeLists.txt). This means by default the coprocessors are not enabled and the cpu clock may not be initialized to the full clock speed.


Starting your first project

The easiest way to start a your first project is using Github codespaces. Github codespaces will download all the required programs and will generate the required header files for all supported microcontrollers. If you want to create a project on your own machine the header files need to be generated manually (this can be done using the CMSIS 'svdconv' utility). The header files should be placed in the targets/chip/target folder with the same name as the target folder. Another way to get the header files is to start a github codespace and download the required headers when it is done converting all the svd files to headers.

For example the svd files for the LPC1756 can be generated using:

svdconv.exe lpc1756.svd --generate=header

The output of the svdconv utility needs to be moved to: targets/chip/lpc1756/lpc1756.h

Selecting target cpu

To select a target cpu the target cpu needs to be added to the commandline when configuring cmake.

(e.g. To configure cmake for the max32660, run the following command)

cmake -B ./build -DTARGET_CPU=max32660

This configures the project for the specific target cpu. To change to a different target, the project has to be reconfigured.

Setup VSCode

(When using vscode with the cmake plugin the following can be added to the settings.json to configure cmake for the max32660 evsys board)

{
// target cpu, should be the same as in the cmake // define this is used in the c_cpp_properties.json // for intellisense"target_cpu": "atsam4s2b",
// target cpu to use when using launch.json// note: this might be different from the define. // for example the "atsam4s2b" does not exist in// the j-link software and requires us to use // "atsam4s2ba" instead. To find the correct name// open j-link and search for your chip"target_cpu_debug": "atsam4s2ba",
"cmake.configureSettings": {
"TARGET_CPU": "atsam4s2b",
"TARGET_LOW_POWER_SLEEP": "1",
"TARGET_BREAK_AT_RESERVED_HANDLER": "1"
},
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
}

Main file

By default klib has no main.cpp file. This has to be created by the user. To use the klib target system klib.hpp needs to be included.

Minimal main file:

#include<klib/klib.hpp>intmain() {
return0;
}

Examples

Another way to start a project is using one of the following examples:

2 factor authenticator dongle

mouse jiggler

Constructors before running main

C++ supports global constructors for objects. These objects will be constructed before main is executed. This is supported by klib. If you want to initialize hardware before these global constructors are called you need to add the attribute __attribute__((__constructor__(x))) to your function definition where x is a number above 102 (the first 100 are reserved by gcc, 101 is reserved for startup code by klib and 102 is reserved for a secondary startup code by klib). This will make sure your function will be executed before any constructor is called.


Using klib

Klib has most library functions documented using doxygen (there is no config file). Please refrence the doxygen/doxywizzard documentation to generate the documentation.

Interrupt handling

By design klib has a default vector table that should not be changed. Instead one of the 3 vector table implementations should be used.

Klib has the following implementations:

  • Ram based vector table (used by default)
  • Ram based vector table with entry and exit hooks (uses more ram and flash than the default implementation)
  • Flash/custom vector table (allows a vector table stored in flash or for a custom ram based implementation)

When chosing one of the ram based vector table implementations all the code works by default as this allows the code to change the interrupt at runtime. When chosing the flash/custom vector table the user needs to create the vector table and pass it to the flash based vector table implementation. With this implementation the interrupts are not configured automaticly when needed and need to be changed by the user to the correct callback/handler. For more information about the different implementations see irq.hpp as a reference.

Tests

Klib has tests for the microcontroller indepented code. The resuls of the tests can be found here

About

Embedded hardware (arm cortex) library to use with cmake and (arm-none-eabi-)gcc

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - itzandroidtab/klib: Embedded hardware (arm cortex) library to use with cmake and (arm-none-eabi-)gcc · GitHub
Skip to content

Repository files navigation

C++ cortex-m hardware library

klib library

Klib uses cmake and arm-none-eabi-gcc to build excecutables for cortex targets. Currently supported targets can be found in the target folder.

Support for devices varies. Currently some targets have a startup file that can be enabled by uncommenting line 6 in the project CMakeLists (project/CMakeLists.txt). This means by default the coprocessors are not enabled and the cpu clock may not be initialized to the full clock speed.


Starting your first project

The easiest way to start a your first project is using Github codespaces. Github codespaces will download all the required programs and will generate the required header files for all supported microcontrollers. If you want to create a project on your own machine the header files need to be generated manually (this can be done using the CMSIS 'svdconv' utility). The header files should be placed in the targets/chip/target folder with the same name as the target folder. Another way to get the header files is to start a github codespace and download the required headers when it is done converting all the svd files to headers.

For example the svd files for the LPC1756 can be generated using:

svdconv.exe lpc1756.svd --generate=header

The output of the svdconv utility needs to be moved to: targets/chip/lpc1756/lpc1756.h

Selecting target cpu

To select a target cpu the target cpu needs to be added to the commandline when configuring cmake.

(e.g. To configure cmake for the max32660, run the following command)

cmake -B ./build -DTARGET_CPU=max32660

This configures the project for the specific target cpu. To change to a different target, the project has to be reconfigured.

Setup VSCode

(When using vscode with the cmake plugin the following can be added to the settings.json to configure cmake for the max32660 evsys board)

{
// target cpu, should be the same as in the cmake // define this is used in the c_cpp_properties.json // for intellisense"target_cpu": "atsam4s2b",
// target cpu to use when using launch.json// note: this might be different from the define. // for example the "atsam4s2b" does not exist in// the j-link software and requires us to use // "atsam4s2ba" instead. To find the correct name// open j-link and search for your chip"target_cpu_debug": "atsam4s2ba",
"cmake.configureSettings": {
"TARGET_CPU": "atsam4s2b",
"TARGET_LOW_POWER_SLEEP": "1",
"TARGET_BREAK_AT_RESERVED_HANDLER": "1"
},
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
}

Main file

By default klib has no main.cpp file. This has to be created by the user. To use the klib target system klib.hpp needs to be included.

Minimal main file:

#include<klib/klib.hpp>intmain() {
return0;
}

Examples

Another way to start a project is using one of the following examples:

2 factor authenticator dongle

mouse jiggler

Constructors before running main

C++ supports global constructors for objects. These objects will be constructed before main is executed. This is supported by klib. If you want to initialize hardware before these global constructors are called you need to add the attribute __attribute__((__constructor__(x))) to your function definition where x is a number above 102 (the first 100 are reserved by gcc, 101 is reserved for startup code by klib and 102 is reserved for a secondary startup code by klib). This will make sure your function will be executed before any constructor is called.


Using klib

Klib has most library functions documented using doxygen (there is no config file). Please refrence the doxygen/doxywizzard documentation to generate the documentation.

Interrupt handling

By design klib has a default vector table that should not be changed. Instead one of the 3 vector table implementations should be used.

Klib has the following implementations:

  • Ram based vector table (used by default)
  • Ram based vector table with entry and exit hooks (uses more ram and flash than the default implementation)
  • Flash/custom vector table (allows a vector table stored in flash or for a custom ram based implementation)

When chosing one of the ram based vector table implementations all the code works by default as this allows the code to change the interrupt at runtime. When chosing the flash/custom vector table the user needs to create the vector table and pass it to the flash based vector table implementation. With this implementation the interrupts are not configured automaticly when needed and need to be changed by the user to the correct callback/handler. For more information about the different implementations see irq.hpp as a reference.

Tests

Klib has tests for the microcontroller indepented code. The resuls of the tests can be found here

About

Embedded hardware (arm cortex) library to use with cmake and (arm-none-eabi-)gcc

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - itzandroidtab/klib: Embedded hardware (arm cortex) library to use with cmake and (arm-none-eabi-)gcc · GitHub
Skip to content

Repository files navigation

C++ cortex-m hardware library

klib library

Klib uses cmake and arm-none-eabi-gcc to build excecutables for cortex targets. Currently supported targets can be found in the target folder.

Support for devices varies. Currently some targets have a startup file that can be enabled by uncommenting line 6 in the project CMakeLists (project/CMakeLists.txt). This means by default the coprocessors are not enabled and the cpu clock may not be initialized to the full clock speed.


Starting your first project

The easiest way to start a your first project is using Github codespaces. Github codespaces will download all the required programs and will generate the required header files for all supported microcontrollers. If you want to create a project on your own machine the header files need to be generated manually (this can be done using the CMSIS 'svdconv' utility). The header files should be placed in the targets/chip/target folder with the same name as the target folder. Another way to get the header files is to start a github codespace and download the required headers when it is done converting all the svd files to headers.

For example the svd files for the LPC1756 can be generated using:

svdconv.exe lpc1756.svd --generate=header

The output of the svdconv utility needs to be moved to: targets/chip/lpc1756/lpc1756.h

Selecting target cpu

To select a target cpu the target cpu needs to be added to the commandline when configuring cmake.

(e.g. To configure cmake for the max32660, run the following command)

cmake -B ./build -DTARGET_CPU=max32660

This configures the project for the specific target cpu. To change to a different target, the project has to be reconfigured.

Setup VSCode

(When using vscode with the cmake plugin the following can be added to the settings.json to configure cmake for the max32660 evsys board)

{
// target cpu, should be the same as in the cmake // define this is used in the c_cpp_properties.json // for intellisense"target_cpu": "atsam4s2b",
// target cpu to use when using launch.json// note: this might be different from the define. // for example the "atsam4s2b" does not exist in// the j-link software and requires us to use // "atsam4s2ba" instead. To find the correct name// open j-link and search for your chip"target_cpu_debug": "atsam4s2ba",
"cmake.configureSettings": {
"TARGET_CPU": "atsam4s2b",
"TARGET_LOW_POWER_SLEEP": "1",
"TARGET_BREAK_AT_RESERVED_HANDLER": "1"
},
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
}

Main file

By default klib has no main.cpp file. This has to be created by the user. To use the klib target system klib.hpp needs to be included.

Minimal main file:

#include<klib/klib.hpp>intmain() {
return0;
}

Examples

Another way to start a project is using one of the following examples:

2 factor authenticator dongle

mouse jiggler

Constructors before running main

C++ supports global constructors for objects. These objects will be constructed before main is executed. This is supported by klib. If you want to initialize hardware before these global constructors are called you need to add the attribute __attribute__((__constructor__(x))) to your function definition where x is a number above 102 (the first 100 are reserved by gcc, 101 is reserved for startup code by klib and 102 is reserved for a secondary startup code by klib). This will make sure your function will be executed before any constructor is called.


Using klib

Klib has most library functions documented using doxygen (there is no config file). Please refrence the doxygen/doxywizzard documentation to generate the documentation.

Interrupt handling

By design klib has a default vector table that should not be changed. Instead one of the 3 vector table implementations should be used.

Klib has the following implementations:

  • Ram based vector table (used by default)
  • Ram based vector table with entry and exit hooks (uses more ram and flash than the default implementation)
  • Flash/custom vector table (allows a vector table stored in flash or for a custom ram based implementation)

When chosing one of the ram based vector table implementations all the code works by default as this allows the code to change the interrupt at runtime. When chosing the flash/custom vector table the user needs to create the vector table and pass it to the flash based vector table implementation. With this implementation the interrupts are not configured automaticly when needed and need to be changed by the user to the correct callback/handler. For more information about the different implementations see irq.hpp as a reference.

Tests

Klib has tests for the microcontroller indepented code. The resuls of the tests can be found here

About

Embedded hardware (arm cortex) library to use with cmake and (arm-none-eabi-)gcc

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - itzandroidtab/klib: Embedded hardware (arm cortex) library to use with cmake and (arm-none-eabi-)gcc · GitHub
Skip to content

Repository files navigation

C++ cortex-m hardware library

klib library

Klib uses cmake and arm-none-eabi-gcc to build excecutables for cortex targets. Currently supported targets can be found in the target folder.

Support for devices varies. Currently some targets have a startup file that can be enabled by uncommenting line 6 in the project CMakeLists (project/CMakeLists.txt). This means by default the coprocessors are not enabled and the cpu clock may not be initialized to the full clock speed.


Starting your first project

The easiest way to start a your first project is using Github codespaces. Github codespaces will download all the required programs and will generate the required header files for all supported microcontrollers. If you want to create a project on your own machine the header files need to be generated manually (this can be done using the CMSIS 'svdconv' utility). The header files should be placed in the targets/chip/target folder with the same name as the target folder. Another way to get the header files is to start a github codespace and download the required headers when it is done converting all the svd files to headers.

For example the svd files for the LPC1756 can be generated using:

svdconv.exe lpc1756.svd --generate=header

The output of the svdconv utility needs to be moved to: targets/chip/lpc1756/lpc1756.h

Selecting target cpu

To select a target cpu the target cpu needs to be added to the commandline when configuring cmake.

(e.g. To configure cmake for the max32660, run the following command)

cmake -B ./build -DTARGET_CPU=max32660

This configures the project for the specific target cpu. To change to a different target, the project has to be reconfigured.

Setup VSCode

(When using vscode with the cmake plugin the following can be added to the settings.json to configure cmake for the max32660 evsys board)

{
// target cpu, should be the same as in the cmake // define this is used in the c_cpp_properties.json // for intellisense"target_cpu": "atsam4s2b",
// target cpu to use when using launch.json// note: this might be different from the define. // for example the "atsam4s2b" does not exist in// the j-link software and requires us to use // "atsam4s2ba" instead. To find the correct name// open j-link and search for your chip"target_cpu_debug": "atsam4s2ba",
"cmake.configureSettings": {
"TARGET_CPU": "atsam4s2b",
"TARGET_LOW_POWER_SLEEP": "1",
"TARGET_BREAK_AT_RESERVED_HANDLER": "1"
},
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
}

Main file

By default klib has no main.cpp file. This has to be created by the user. To use the klib target system klib.hpp needs to be included.

Minimal main file:

#include<klib/klib.hpp>intmain() {
return0;
}

Examples

Another way to start a project is using one of the following examples:

2 factor authenticator dongle

mouse jiggler

Constructors before running main

C++ supports global constructors for objects. These objects will be constructed before main is executed. This is supported by klib. If you want to initialize hardware before these global constructors are called you need to add the attribute __attribute__((__constructor__(x))) to your function definition where x is a number above 102 (the first 100 are reserved by gcc, 101 is reserved for startup code by klib and 102 is reserved for a secondary startup code by klib). This will make sure your function will be executed before any constructor is called.


Using klib

Klib has most library functions documented using doxygen (there is no config file). Please refrence the doxygen/doxywizzard documentation to generate the documentation.

Interrupt handling

By design klib has a default vector table that should not be changed. Instead one of the 3 vector table implementations should be used.

Klib has the following implementations:

  • Ram based vector table (used by default)
  • Ram based vector table with entry and exit hooks (uses more ram and flash than the default implementation)
  • Flash/custom vector table (allows a vector table stored in flash or for a custom ram based implementation)

When chosing one of the ram based vector table implementations all the code works by default as this allows the code to change the interrupt at runtime. When chosing the flash/custom vector table the user needs to create the vector table and pass it to the flash based vector table implementation. With this implementation the interrupts are not configured automaticly when needed and need to be changed by the user to the correct callback/handler. For more information about the different implementations see irq.hpp as a reference.

Tests

Klib has tests for the microcontroller indepented code. The resuls of the tests can be found here

About

Embedded hardware (arm cortex) library to use with cmake and (arm-none-eabi-)gcc

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - itzandroidtab/klib: Embedded hardware (arm cortex) library to use with cmake and (arm-none-eabi-)gcc · GitHub
Skip to content

Repository files navigation

C++ cortex-m hardware library

klib library

Klib uses cmake and arm-none-eabi-gcc to build excecutables for cortex targets. Currently supported targets can be found in the target folder.

Support for devices varies. Currently some targets have a startup file that can be enabled by uncommenting line 6 in the project CMakeLists (project/CMakeLists.txt). This means by default the coprocessors are not enabled and the cpu clock may not be initialized to the full clock speed.


Starting your first project

The easiest way to start a your first project is using Github codespaces. Github codespaces will download all the required programs and will generate the required header files for all supported microcontrollers. If you want to create a project on your own machine the header files need to be generated manually (this can be done using the CMSIS 'svdconv' utility). The header files should be placed in the targets/chip/target folder with the same name as the target folder. Another way to get the header files is to start a github codespace and download the required headers when it is done converting all the svd files to headers.

For example the svd files for the LPC1756 can be generated using:

svdconv.exe lpc1756.svd --generate=header

The output of the svdconv utility needs to be moved to: targets/chip/lpc1756/lpc1756.h

Selecting target cpu

To select a target cpu the target cpu needs to be added to the commandline when configuring cmake.

(e.g. To configure cmake for the max32660, run the following command)

cmake -B ./build -DTARGET_CPU=max32660

This configures the project for the specific target cpu. To change to a different target, the project has to be reconfigured.

Setup VSCode

(When using vscode with the cmake plugin the following can be added to the settings.json to configure cmake for the max32660 evsys board)

{
// target cpu, should be the same as in the cmake // define this is used in the c_cpp_properties.json // for intellisense"target_cpu": "atsam4s2b",
// target cpu to use when using launch.json// note: this might be different from the define. // for example the "atsam4s2b" does not exist in// the j-link software and requires us to use // "atsam4s2ba" instead. To find the correct name// open j-link and search for your chip"target_cpu_debug": "atsam4s2ba",
"cmake.configureSettings": {
"TARGET_CPU": "atsam4s2b",
"TARGET_LOW_POWER_SLEEP": "1",
"TARGET_BREAK_AT_RESERVED_HANDLER": "1"
},
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
}

Main file

By default klib has no main.cpp file. This has to be created by the user. To use the klib target system klib.hpp needs to be included.

Minimal main file:

#include<klib/klib.hpp>intmain() {
return0;
}

Examples

Another way to start a project is using one of the following examples:

2 factor authenticator dongle

mouse jiggler

Constructors before running main

C++ supports global constructors for objects. These objects will be constructed before main is executed. This is supported by klib. If you want to initialize hardware before these global constructors are called you need to add the attribute __attribute__((__constructor__(x))) to your function definition where x is a number above 102 (the first 100 are reserved by gcc, 101 is reserved for startup code by klib and 102 is reserved for a secondary startup code by klib). This will make sure your function will be executed before any constructor is called.


Using klib

Klib has most library functions documented using doxygen (there is no config file). Please refrence the doxygen/doxywizzard documentation to generate the documentation.

Interrupt handling

By design klib has a default vector table that should not be changed. Instead one of the 3 vector table implementations should be used.

Klib has the following implementations:

  • Ram based vector table (used by default)
  • Ram based vector table with entry and exit hooks (uses more ram and flash than the default implementation)
  • Flash/custom vector table (allows a vector table stored in flash or for a custom ram based implementation)

When chosing one of the ram based vector table implementations all the code works by default as this allows the code to change the interrupt at runtime. When chosing the flash/custom vector table the user needs to create the vector table and pass it to the flash based vector table implementation. With this implementation the interrupts are not configured automaticly when needed and need to be changed by the user to the correct callback/handler. For more information about the different implementations see irq.hpp as a reference.

Tests

Klib has tests for the microcontroller indepented code. The resuls of the tests can be found here

About

Embedded hardware (arm cortex) library to use with cmake and (arm-none-eabi-)gcc

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - itzandroidtab/klib: Embedded hardware (arm cortex) library to use with cmake and (arm-none-eabi-)gcc · GitHub
Skip to content

Repository files navigation

C++ cortex-m hardware library

klib library

Klib uses cmake and arm-none-eabi-gcc to build excecutables for cortex targets. Currently supported targets can be found in the target folder.

Support for devices varies. Currently some targets have a startup file that can be enabled by uncommenting line 6 in the project CMakeLists (project/CMakeLists.txt). This means by default the coprocessors are not enabled and the cpu clock may not be initialized to the full clock speed.


Starting your first project

The easiest way to start a your first project is using Github codespaces. Github codespaces will download all the required programs and will generate the required header files for all supported microcontrollers. If you want to create a project on your own machine the header files need to be generated manually (this can be done using the CMSIS 'svdconv' utility). The header files should be placed in the targets/chip/target folder with the same name as the target folder. Another way to get the header files is to start a github codespace and download the required headers when it is done converting all the svd files to headers.

For example the svd files for the LPC1756 can be generated using:

svdconv.exe lpc1756.svd --generate=header

The output of the svdconv utility needs to be moved to: targets/chip/lpc1756/lpc1756.h

Selecting target cpu

To select a target cpu the target cpu needs to be added to the commandline when configuring cmake.

(e.g. To configure cmake for the max32660, run the following command)

cmake -B ./build -DTARGET_CPU=max32660

This configures the project for the specific target cpu. To change to a different target, the project has to be reconfigured.

Setup VSCode

(When using vscode with the cmake plugin the following can be added to the settings.json to configure cmake for the max32660 evsys board)

{
// target cpu, should be the same as in the cmake // define this is used in the c_cpp_properties.json // for intellisense"target_cpu": "atsam4s2b",
// target cpu to use when using launch.json// note: this might be different from the define. // for example the "atsam4s2b" does not exist in// the j-link software and requires us to use // "atsam4s2ba" instead. To find the correct name// open j-link and search for your chip"target_cpu_debug": "atsam4s2ba",
"cmake.configureSettings": {
"TARGET_CPU": "atsam4s2b",
"TARGET_LOW_POWER_SLEEP": "1",
"TARGET_BREAK_AT_RESERVED_HANDLER": "1"
},
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
}

Main file

By default klib has no main.cpp file. This has to be created by the user. To use the klib target system klib.hpp needs to be included.

Minimal main file:

#include<klib/klib.hpp>intmain() {
return0;
}

Examples

Another way to start a project is using one of the following examples:

2 factor authenticator dongle

mouse jiggler

Constructors before running main

C++ supports global constructors for objects. These objects will be constructed before main is executed. This is supported by klib. If you want to initialize hardware before these global constructors are called you need to add the attribute __attribute__((__constructor__(x))) to your function definition where x is a number above 102 (the first 100 are reserved by gcc, 101 is reserved for startup code by klib and 102 is reserved for a secondary startup code by klib). This will make sure your function will be executed before any constructor is called.


Using klib

Klib has most library functions documented using doxygen (there is no config file). Please refrence the doxygen/doxywizzard documentation to generate the documentation.

Interrupt handling

By design klib has a default vector table that should not be changed. Instead one of the 3 vector table implementations should be used.

Klib has the following implementations:

  • Ram based vector table (used by default)
  • Ram based vector table with entry and exit hooks (uses more ram and flash than the default implementation)
  • Flash/custom vector table (allows a vector table stored in flash or for a custom ram based implementation)

When chosing one of the ram based vector table implementations all the code works by default as this allows the code to change the interrupt at runtime. When chosing the flash/custom vector table the user needs to create the vector table and pass it to the flash based vector table implementation. With this implementation the interrupts are not configured automaticly when needed and need to be changed by the user to the correct callback/handler. For more information about the different implementations see irq.hpp as a reference.

Tests

Klib has tests for the microcontroller indepented code. The resuls of the tests can be found here

About

Embedded hardware (arm cortex) library to use with cmake and (arm-none-eabi-)gcc

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages