Fork of mbed-src file paths change. LPC1114FN28 use only.

Fork of mbed-src by mbed official

Information

この情報は2013/10/28時点での解決方法です。
現在はmbed-src、標準ライブラリで問題なくコンパイルが可能です。

・使う物
LPC1114FN28
mbed SDK

LPC1114FN28でmbed-SDKのLibraryを使うとCompile出来ない。(2013/10/28) /media/uploads/minicube/mbed_lpc1114_sdk.png

パスが通ってないだけのようなのでファイルを以下に移動する。

mbed-src\targets\cmsis\TARGET_NXP\TARGET_LPC11XX_11CXX\
mbed-src\targets\cmsis\TARGET_NXP\TARGET_LPC11XX_11CXX\TARGET_LPC11XX\

にあるファイルをすべて

mbed-src\targets\cmsis\TARGET_NXP\

へ移動

mbed-src\targets\cmsis\TARGET_NXP\TARGET_LPC11XX_11CXX\にある

TOOLCHAIN_ARM_MICRO

をフォルダごと

mbed-src\targets\cmsis\TARGET_NXP\

へ移動

mbed-src\targets\hal\TARGET_NXP\TARGET_LPC11XX_11CXX\
mbed-src\targets\hal\TARGET_NXP\TARGET_LPC11XX_11CXX\TARGET_LPC11XX\

にあるファイルをすべて

mbed-src\targets\hal\TARGET_NXP\

へ移動

移動後は以下のような構成になると思います。
※不要なファイルは削除してあります。

/media/uploads/minicube/mbed_lpc1114_sdk_tree.png


ファイルの移動が面倒なので以下に本家からフォークしたライブラリを置いておきます。

Import librarymbed-src-LPC1114FN28

Fork of mbed-src file paths change. LPC1114FN28 use only.


エラーが出力される場合

"TOOLCHAIN_ARM_MICRO"が無いとエラーになる。

Error: Undefined symbol _initial_sp (referred from entry2.o).
Error: Undefined symbol _heap_base (referred from malloc.o).
Error: Undefined symbol _heap_limit (referred from malloc.o).

LPC1114FN28はMicrolibを使ってCompileされるため上記のエラーになるようです。

Revision:
21:67d3158c7b56
Parent:
13:0645d8841f51
Child:
35:371630885ad6
--- a/targets/hal/TARGET_NXP/TARGET_LPC176X/gpio_irq_api.c	Tue Sep 10 15:14:19 2013 +0300
+++ b/targets/hal/TARGET_NXP/TARGET_LPC176X/gpio_irq_api.c	Wed Sep 11 16:54:00 2013 +0100
@@ -31,44 +31,52 @@
     uint32_t fall0 = LPC_GPIOINT->IO0IntStatF;
     uint32_t rise2 = LPC_GPIOINT->IO2IntStatR;
     uint32_t fall2 = LPC_GPIOINT->IO2IntStatF;
-    uint32_t mask0 = 0;
-    uint32_t mask2 = 0;
-    int i;
-
-    // P0.0-0.31
-    for (i = 0; i < 32; i++) {
-        uint32_t pmask = (1 << i);
-        if (rise0 & pmask) {
-            mask0 |= pmask;
-            if (channel_ids[i] != 0)
-                irq_handler(channel_ids[i], IRQ_RISE);
-        }
-        if (fall0 & pmask) {
-            mask0 |= pmask;
-            if (channel_ids[i] != 0)
-                irq_handler(channel_ids[i], IRQ_FALL);
-        }
+    uint8_t bitloc;
+    
+    while(rise0 > 0) {      //Continue as long as there are interrupts pending
+        bitloc = 31 - __CLZ(rise0); //CLZ returns number of leading zeros, 31 minus that is location of first pending interrupt
+        if (channel_ids[bitloc] != 0)
+            irq_handler(channel_ids[bitloc], IRQ_RISE); //Run that interrupt
+        
+        //Both clear the interrupt with clear register, and remove it from our local copy of the interrupt pending register
+        LPC_GPIOINT->IO0IntClr = 1 << bitloc;
+        rise0 -= 1<<bitloc;
+    }
+    
+    while(fall0 > 0) {      //Continue as long as there are interrupts pending
+        bitloc = 31 - __CLZ(fall0); //CLZ returns number of leading zeros, 31 minus that is location of first pending interrupt
+        if (channel_ids[bitloc] != 0)
+            irq_handler(channel_ids[bitloc], IRQ_FALL); //Run that interrupt
+        
+        //Both clear the interrupt with clear register, and remove it from our local copy of the interrupt pending register
+        LPC_GPIOINT->IO0IntClr = 1 << bitloc;
+        fall0 -= 1<<bitloc;
     }
     
-    // P2.0-2.15
-    for (i = 0; i < 16; i++) {
-        uint32_t pmask = (1 << i);
-        int channel_index = i + 32;
-        if (rise2 & pmask) {
-            mask2 |= pmask;
-            if (channel_ids[channel_index] != 0)
-                irq_handler(channel_ids[channel_index], IRQ_RISE);
-        }
-        if (fall2 & pmask) {
-            mask2 |= pmask;
-            if (channel_ids[channel_index] != 0)
-                irq_handler(channel_ids[channel_index], IRQ_FALL);
-        }
+    //Same for port 2, only we need to watch the channel_index
+    while(rise2 > 0) {      //Continue as long as there are interrupts pending
+        bitloc = 31 - __CLZ(rise2); //CLZ returns number of leading zeros, 31 minus that is location of first pending interrupt
+        
+        if (bitloc < 16)            //Not sure if this is actually needed
+            if (channel_ids[bitloc+32] != 0)
+                irq_handler(channel_ids[bitloc+32], IRQ_RISE); //Run that interrupt
+        
+        //Both clear the interrupt with clear register, and remove it from our local copy of the interrupt pending register
+        LPC_GPIOINT->IO2IntClr = 1 << bitloc;
+        rise2 -= 1<<bitloc;
     }
-
-    // Clear the interrupts we just handled
-    LPC_GPIOINT->IO0IntClr = mask0;
-    LPC_GPIOINT->IO2IntClr = mask2;
+    
+    while(fall2 > 0) {      //Continue as long as there are interrupts pending
+        bitloc = 31 - __CLZ(fall2); //CLZ returns number of leading zeros, 31 minus that is location of first pending interrupt
+        
+        if (bitloc < 16)            //Not sure if this is actually needed
+            if (channel_ids[bitloc+32] != 0)
+                irq_handler(channel_ids[bitloc+32], IRQ_FALL); //Run that interrupt
+        
+        //Both clear the interrupt with clear register, and remove it from our local copy of the interrupt pending register
+        LPC_GPIOINT->IO2IntClr = 1 << bitloc;
+        fall2 -= 1<<bitloc;
+    }
 }
 
 int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id) {