发布:驱动大全之同步与互斥

This commit is contained in:
weidongshan
2020-06-18 16:38:04 +08:00
parent 7a0389dcbc
commit 6516f0c0ae
19 changed files with 5972 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
test: main.c
arm-linux-gnueabihf-gcc -o $@ $^
clean:
rm test

View File

@@ -0,0 +1,26 @@
#include <stdio.h>
#include <stdlib.h>
int add(int a, int b)
{
return a+b;
}
int main(int argc, char **argv)
{
int a;
int b;
if (argc != 3)
{
printf("Usage: %s <val1> <val2>\n", argv[0]);
return -1;
}
a = (int)strtol(argv[1], NULL, 0);
b = (int)strtol(argv[2], NULL, 0);
printf("%d + %d = %d\n", a, b, add(a, b));
return 0;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
CROSS=arm-linux-gnueabihf-
test: main.c add.S
$(CROSS)gcc -o $@ $^
$(CROSS)objdump -D $@ > $@.dis
clean:
rm test

View File

@@ -0,0 +1,8 @@
.text //
.global add // add
.thumb // 使thumb, main.c使thumb, 使thumb
add:
add r0, r0, r1
bx lr

View File

@@ -0,0 +1,23 @@
#include <stdio.h>
#include <stdlib.h>
extern int add(int a, int b);
int main(int argc, char **argv)
{
int a;
int b;
if (argc != 3)
{
printf("Usage: %s <val1> <val2>\n", argv[0]);
return -1;
}
a = (int)strtol(argv[1], NULL, 0);
b = (int)strtol(argv[2], NULL, 0);
printf("%d + %d = %d\n", a, b, add(a, b));
return 0;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
CROSS=arm-linux-gnueabihf-
test: main.c
$(CROSS)gcc -o $@ $^
$(CROSS)objdump -D $@ > $@.dis
clean:
rm test

View File

@@ -0,0 +1,33 @@
#include <stdio.h>
#include <stdlib.h>
int add(int a, int b)
{
int sum;
__asm__ volatile (
"add %0, %1, %2"
:"=r"(sum)
:"r"(a), "r"(b)
:"cc"
);
return sum;
}
int main(int argc, char **argv)
{
int a;
int b;
if (argc != 3)
{
printf("Usage: %s <val1> <val2>\n", argv[0]);
return -1;
}
a = (int)strtol(argv[1], NULL, 0);
b = (int)strtol(argv[2], NULL, 0);
printf("%d + %d = %d\n", a, b, add(a, b));
return 0;
}

View File

@@ -0,0 +1,33 @@
#include <stdio.h>
#include <stdlib.h>
int add(int a, int b)
{
int sum;
__asm__ volatile (
"add %[result], %[val1], %[val2]"
:[result]"=r"(sum)
:[val1]"r"(a), [val2]"r"(b)
:"cc"
);
return sum;
}
int main(int argc, char **argv)
{
int a;
int b;
if (argc != 3)
{
printf("Usage: %s <val1> <val2>\n", argv[0]);
return -1;
}
a = (int)strtol(argv[1], NULL, 0);
b = (int)strtol(argv[2], NULL, 0);
printf("%d + %d = %d\n", a, b, add(a, b));
return 0;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
CROSS=arm-linux-gnueabihf-
test: main.c
$(CROSS)gcc -o $@ $^
$(CROSS)objdump -D $@ > $@.dis
clean:
rm test

View File

@@ -0,0 +1,35 @@
#include <stdio.h>
#include <stdlib.h>
int add(int a, int b)
{
int sum;
__asm__ volatile (
"add %0, %1, %2\n"
"add %1, #1\n"
"add %2, #1\n"
:"=&r"(sum)
:"r"(a), "r"(b)
:"cc"
);
return sum;
}
int main(int argc, char **argv)
{
int a;
int b;
if (argc != 3)
{
printf("Usage: %s <val1> <val2>\n", argv[0]);
return -1;
}
a = (int)strtol(argv[1], NULL, 0);
b = (int)strtol(argv[2], NULL, 0);
printf("%d + %d = %d\n", a, b, add(a, b));
return 0;
}

File diff suppressed because it is too large Load Diff

Binary file not shown.