-
Notifications
You must be signed in to change notification settings - Fork 3k
Support mbed_start_application for Cortex-M23 #6949
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me
With "mov r2, #0", compile OK with GCC_ARM, but failed with ARMC6. With "ldr r2, =0", compile OK with ARMC6, but failed with GCC_ARM. Finally, with "movw r2, #0"/"movt r2, #0", compile OK with both ARMC6 and GCC_ARM.
In 646f614, I fix
|
@dreemkiller Mind taking a look at this? Not sure who else would be familiar with the M23 aside for you and @deepikabhavnani |
@TacoGrandeTX, take a look |
platform/mbed_application.c
Outdated
@@ -48,12 +48,20 @@ static void powerdown_nvic() | |||
int i; | |||
int j; | |||
|
|||
#if defined(__CORTEX_M23) | |||
isr_groups_32 = 16; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
16 is not a good number... and more than even a M33 could support. The max number of external interrupts a M23 can support is 240. It's sad that M23 doesn't have the ICTR so the max value we could use here is 7 (or 8... depending on how it's used elsewhere). Rule SGCR in v8-M ARM states: "When a particular NVIC interrupt line is not implemented, the registers that are associated with it are reserved." Yet Rule GLNG states "Privileged accesses to unimplemented registers are RES0" so accessing non-existing registers should be harmless but are wasteful.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@TacoGrandeTX Thanks for your detailed information. I fix it in 3c14cb6.
platform/mbed_application.c
Outdated
@@ -69,17 +77,20 @@ static void powerdown_scb(uint32_t vtor) | |||
SCB->SCR = 0x00000000; | |||
// SCB->CCR - Implementation defined value | |||
for (i = 0; i < 12; i++) { | |||
#if defined(__CORTEX_M7) | |||
#if defined(__CORTEX_M7) || defined(__CORTEX_M23) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not good - M23 has only 2 SHPR registers (the first is reserved). Looks like we have mixed up the size of our register definitions... core_cm23.h is using uint32_t (x2) while core_cm7.h is using uint8_t (x12). We need two for loops or should change SCB_Type in core_cm23.h.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@TacoGrandeTX I fix it in 3c14cb6.
platform/mbed_application.c
Outdated
@@ -107,7 +118,12 @@ __asm static void start_new_application(void *sp, void *pc) | |||
void start_new_application(void *sp, void *pc) | |||
{ | |||
__asm volatile ( | |||
#if defined(__CORTEX_M23) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This two-instruction sequence is not required... "mov r2, #0" will put 0 (zero-extended) into r2 on the M23. We can remove the entire #if block. MOVW/MOVT is useful for loading a full 32-value into a register without a literal pool... not the case here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry - missed the commit comments! Clearly AC6 is not accepting the inline assembly properly (I ran a local test) so perhaps we could use "movw r2, #0" for both conditions and still remove the #if block.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@TacoGrandeTX I replace with movw
/movt
and remove #if
block in 3c14cb6.
@ccli8 ^^^ ? |
Taking another look at this PR, this can come in with a patch release. |
1. M23 doesn't support ICTR and supports up to 240 external interrupts. 2. Fix reset of SHPR 3. Fix inline assembly compile error with ARMC6
@TacoGrandeTX @deepikabhavnani Mind re-reviewing? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
MOVT is superfluous - recommend removing it.
platform/mbed_application.c
Outdated
@@ -118,12 +125,8 @@ __asm static void start_new_application(void *sp, void *pc) | |||
void start_new_application(void *sp, void *pc) | |||
{ | |||
__asm volatile ( | |||
#if defined(__CORTEX_M23) | |||
"movw r2, #0 \n" | |||
"movw r2, #0 \n" // Fail to compile "mov r2, #0" with ARMC6. Replace with movw/movt. | |||
"movt r2, #0 \n" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry - my previous comments weren't very clear! MOVT is superfluous here as MOVW will zero-extend. So we can remove the MOVT instruction. "MOVW r2, #0" will put 0x0 into all 32-bits of r2.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@TacoGrandeTX Yes, MOVT is superfluous. I remove it in 23dcd82.
Looks like all of the review comments have been addressed. /morph build |
Build : SUCCESSBuild number : 2215 Triggering tests/morph test |
Restarted pr-head |
Exporter Build : SUCCESSBuild number : 1842 |
Test : FAILUREBuild number : 2011 |
Interesting... Don't think the test failure is the PR's fault. |
Test : SUCCESSBuild number : 2015 |
@TacoGrandeTX Could you re-approve if you're alright with the changes? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good!
/morph build |
Oh... |
Build : SUCCESSBuild number : 2253 Triggering tests/morph test |
Test : SUCCESSBuild number : 2042 |
Exporter Build : SUCCESSBuild number : 1878 |
Description
This PR implements
mbed_start_application
on Cortex-M23 for bootloader related application.Pull request type