嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ d9 r: X; `' }% H3 y0 d1 L- U
0 S; @/ @8 E: C, l; `7 |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ Z3 H y0 Q+ ]! K& j# |
#include <unistd.h>
# }0 y/ X; e* [/ w; W
#include <sys/mman.h>
; @2 k! E# y6 z/ n/ M* j6 X5 `6 m
#include <sys/types.h>
, I) _) h1 J4 D5 b5 R
#include <fcntl.h>
5 W9 H; N1 _9 C- i# V
& u* h/ R% t$ v1 k I
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ E8 [/ {1 }: @' C+ O/ N+ O
1 `- [+ x( g5 z9 ~8 {
typedef struct
9 H) H7 H% T) X/ j1 b2 a& f* e
{
# j+ b& x5 A# J& [* \/ ^
unsigned int a;
' g( f" k* Z, V% h3 \0 w
unsigned int b;
/ q! Y* e4 u( F
unsigned int packet_cout;
" F& l" z( ]7 {5 m U! Q* R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& T. V* {# s1 J
0 S. o9 n- W; W8 g, O' j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 ^+ L' k" j7 V1 ?
unsigned int count_copy = 0;
D0 @2 U+ @6 t6 B
; D: a0 P( u L5 x5 Q1 D
/ L" M! \! B* c2 o% M+ p$ S+ k
int main()
7 ?3 {1 ^6 I# J- N% Z
{
* q, g. j% N. q% c; ]8 |8 Y' V
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 X% E9 j( d; D2 F5 M, i
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( H; {: p8 H) K- O9 o
4 E4 G: j/ \" w/ r7 i8 V- }
while(1)
0 c# w. g1 n/ r- l( @' m: F
{
8 Z1 ]% m+ A6 p( B! n
read_MSG_buffer(pshreRAM);
+ d+ k% o w u3 M1 c
}
k8 o5 Q1 F2 l' L$ V5 T7 m
}
$ y# l% y8 k5 x& B7 s* G
" k; p) v! i. S! K" c& ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 t# c6 [6 G/ d
{
3 m/ e* |. Y5 f" P
RX_MSG_PROTOCOL buf;
# T3 h1 Z6 w, G% w3 j8 O* I
( j* O3 |4 W4 T. O* U! Y
buf.a = pshreRAM->a;
6 W6 h8 O$ n. p
buf.b = pshreRAM->b;
3 b. N3 C4 z% x- d3 g
buf.packet_cout = pshreRAM->packet_cout;
( `1 }/ S1 j* f' n, h6 T
. R2 l) t. s0 R# J. p& T
if(buf.packet_cout != count_copy)
: S3 L+ e* c/ x6 {) ^1 U$ ^; m
{
5 b! a5 Z, ]6 J8 f: M0 Q
printf("a is %d\n", buf.a);
1 g+ @. j6 U$ u; T+ H
printf("b is %d\n", buf.b);
0 N# m9 o2 h% l7 E C
printf("count is %d\n", buf.packet_cout);
, [6 B7 v6 q, r: S2 l/ f- h4 i
count_copy = buf.packet_cout;
& |/ m- o: B, r3 u* }" K9 \7 l
}
1 p! o: y$ z; E9 s% B' g
else
d: ^( C6 F5 a4 m# A9 T
{
, L9 c& V0 u+ Z* x2 d
printf("No effective message!");
8 b" @: w n) Q# i+ J
}
: h' b7 T6 I T8 b% N, |! ? g7 W
}
8 _6 |/ I5 r2 c
) M, C# x. U. I
! P& ?3 p9 b6 P( R7 h+ a6 ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& O- b' j3 f( ]3 g- p/ G
使用下面代码,对内存使用了mmap函数后:
; H, l G6 C5 `( n) c! T/ X
#include <stdio.h>
7 P; M( O) o4 W7 {1 \" W& Z
#include <unistd.h>
" f+ i& y1 N" s! q; B! x8 {
#include <sys/mman.h>
: o P8 R( {6 N
#include <sys/types.h>
6 c; w, k5 Y$ t! l* D# y) P; i5 B5 T) t
#include <fcntl.h>
3 Z6 I r; ^0 i5 r
- g: @7 {, [1 A* @
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 g; T& t0 \4 j
#define SHAER_RAM_SIZE (0x20000)
& f6 ~' R+ j9 l/ j6 T3 \
+ E$ V- N- J1 J7 h: [7 J0 B. m! N
typedef struct
" \1 T. E# o4 m
{
6 ?4 ~6 M) g" \" C! g
unsigned int a;
" X* \) ~" I6 Z7 H I4 C4 H4 x
unsigned int b;
. c2 j0 l! y8 _% ?
unsigned int packet_cout;
3 R8 t* h4 n5 u( ?* w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 n! E% f& u7 K
7 H- {$ e2 i7 r# E9 L2 P; ~: {
void read_MSG_buffer(int *baseaddr);
. v5 L2 F/ B, C5 c! C( N% Z6 ~
unsigned int count_copy = 0;
! f D) @0 p# P2 W) I
) l* G; N8 | M3 D7 Y, k1 Z
int main()
1 z \& ? a2 x
{
# n& v6 ~: A, t0 v8 w
int fd;
! n: I! k9 a/ e* A$ q
int *mem = NULL;
2 }% @+ S/ w4 M. o% E$ Z( s
/ u/ K1 A4 o8 R X7 w
if((fd = open("/dev/mem", O_RDWR)) <0)
5 f1 ^" G4 |, J6 S4 ?
{
6 @& |: t+ [ L
perror("open error");
" o7 d; \( c" X% K9 t5 i; a3 R
return -1;
" d" L$ ?# g) o' }% t, K
}
- S! ?/ H6 r; M4 `" M! d
; q* O9 u5 k6 A- x
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ M1 ?4 H. N! `+ n
/ B, h' c7 D5 V! u3 p( T3 C/ S; r
while(1)
G) ?! x. Y1 N' P
{
4 L" _; N' t7 f* T* T
read_MSG_buffer(mem);
' P" F& z1 r& F% q, G) `: _
}
1 h; x# f5 v' l# b; i) f
}
0 X/ }+ O4 @: u2 P
1 r/ I+ I9 I$ v4 Z
void read_MSG_buffer(int *baseaddr)
6 c" Q2 l( R b1 y# u
{
) `+ w* j+ ]/ o% w: o
pRX_MSG_PROTOCOL pshreRAM = NULL;
( s) e0 B& r ?5 n6 H
" A2 V I. A, C9 i6 e
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 Q/ L$ R2 i/ `; p
& T$ g2 i0 u8 e
if(pshreRAM->packet_cout != count_copy)
( I6 v' ~! s8 m8 S" ]
{
! \2 _9 m4 i, y' ^
printf("a is %d\n", pshreRAM->a);
8 [" k u- c" g+ f7 K
printf("b is %d\n", pshreRAM->b);
3 {' `7 I- l1 {1 n% c
printf("count is %d\n", pshreRAM->packet_cout);
9 q: |+ R+ p0 t$ u
count_copy = pshreRAM->packet_cout;
+ J5 V$ V3 j, n
}
, b- ^3 V+ e) @4 _1 T9 h4 W+ O
else
1 U, @3 V. P) N; C$ c
{
) |% _9 F7 g$ M/ e+ m4 F4 c
printf("No effective message!\n");
$ Y- A$ W& N& h
}
- \1 o, ?9 t/ P4 f& d! ]5 U$ W8 W
}
5 E# e# B) C% c/ x
5 [1 M% ~ ^9 k H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 |, ~ A# `5 W k' s6 u
$ z; L+ L% E- C" x; q/ O" b- \1 Y5 i
; A+ z6 s$ \; D6 B" ?' _ e( E S
C4 k) N8 R5 Q; A
! q, a$ A. R. L9 E; J6 F+ j. j0 W$ g
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4