嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! k. R, T% Z* n) m, K
4 R: X1 }6 F4 i! g" H. A& ?+ @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' Q: v3 N1 f! T5 h6 m. ?: [
#include <unistd.h>
! K# z% { D' y0 U
#include <sys/mman.h>
8 l+ |2 u$ v& I$ B0 L3 [! q
#include <sys/types.h>
+ U0 [4 m/ U) R
#include <fcntl.h>
; } A" Q9 ]3 m$ P0 ^
+ h. V/ D% l6 m" `6 R
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 [6 S. p" r4 j, |7 ]
" q+ L; N$ H" D! n% h$ P; ?& ?
typedef struct
0 n/ Z1 m+ z1 L! t
{
3 Y! w' o# b6 M9 J% x' z
unsigned int a;
" @! ~* m7 G9 Z* X* X* n$ u
unsigned int b;
0 ?6 h3 d2 G3 A; l9 h
unsigned int packet_cout;
# R f% v9 h0 S0 A: V; D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ g# b& Y& }5 a* D% O A$ a
8 N+ D5 F7 B7 H$ w2 z7 f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ T2 u/ j3 C3 `& U# p: H! ^
unsigned int count_copy = 0;
0 r& Y/ p6 ~. R
. s" u4 i7 o1 c* `7 M9 p
4 p2 q6 T9 p' C# H g
int main()
3 x }. c1 `3 `9 T
{
! o9 n1 }7 h' c( U5 s, \ Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 W9 ]6 x% x7 |; i7 w9 Q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ M" R$ [! t- X h
- y' m: h) d- @1 M8 ^) p, ~
while(1)
: W6 ]) s9 _6 ~6 p7 r
{
3 S! |0 i* L: f8 V! P
read_MSG_buffer(pshreRAM);
1 w* T- ]- ]7 Y B! h7 L
}
9 v- d2 E# Y( |
}
& |- C+ t- T* b+ u6 I+ @8 S |
+ ?, n2 h) w- m: h/ m t& X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' }; S2 K* m6 l
{
; o: x( C# k- B
RX_MSG_PROTOCOL buf;
+ ]; S/ R0 F! C
8 o1 ^9 g3 s$ f; o% \
buf.a = pshreRAM->a;
5 @8 ?. @8 B! w. V% R/ c
buf.b = pshreRAM->b;
* y3 Y7 P! n$ A* u. ^! |
buf.packet_cout = pshreRAM->packet_cout;
" [3 A: r7 q4 h
" m' k3 B9 a6 W, o- O s* U
if(buf.packet_cout != count_copy)
% _ \' L7 H, x5 V: v
{
6 o/ |6 I. h" [2 S3 i: V6 o
printf("a is %d\n", buf.a);
8 W8 P4 H; G( Z5 k
printf("b is %d\n", buf.b);
+ w- W+ d0 Z. r! R6 V
printf("count is %d\n", buf.packet_cout);
6 c6 N" D; {3 [- V/ B- [1 R
count_copy = buf.packet_cout;
) l' Z& d3 c! |! s+ B ~) K
}
' z! h& g- j. t6 P- q' u8 L$ l
else
0 h! |% w$ D0 {7 C# H- _+ H
{
( ~& p3 [" g8 C' d# n; }- B9 j
printf("No effective message!");
) ^: c- U% d& Z8 k: {1 e
}
+ Z' v |, N/ S+ n% b
}
s Z. v8 D$ }3 d! s! I8 f
' o0 n/ b9 x0 T+ A+ O
) P' }' S4 \+ L6 `& R! n. T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' w+ {$ k. U& W. ?: s) \
使用下面代码,对内存使用了mmap函数后:
9 x) S; @8 o1 E8 U
#include <stdio.h>
, Y. |/ p2 F& ]& i
#include <unistd.h>
9 J, r- T4 t" P
#include <sys/mman.h>
. k0 { h2 x! w7 d) _
#include <sys/types.h>
' }/ Y: M. D5 a- O. B3 b
#include <fcntl.h>
5 C& m _9 _8 l5 \7 o6 r9 Z+ v+ C2 I
3 ?5 s( C- g: _* K, n5 G' Z" a" I3 I
#define SHAER_RAM_BASE_ADDR (0x80000000)
& u' a0 z2 u1 S6 _+ N
#define SHAER_RAM_SIZE (0x20000)
& M8 s7 ]- w# h# J q0 a" d: A* L/ \
- ?% t5 { W, u3 l0 T& E! e; `
typedef struct
: j5 a* k. ]+ A; p8 p: @- L
{
$ A: V, z3 f$ U: I4 f
unsigned int a;
1 X# n' m) U" @" X) L- D8 C
unsigned int b;
7 _) u" r" w; y9 J6 ]; J
unsigned int packet_cout;
2 \' ^& T6 e+ s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ w6 W' V: V# [; u$ r5 s0 N$ U& N
% Q8 f" E* n0 H( V! H; P' c, r1 Y+ j
void read_MSG_buffer(int *baseaddr);
9 M3 z3 u4 o" R# H
unsigned int count_copy = 0;
6 ?$ i, P7 W' u* E( F* I
# D0 a4 C6 I! l7 C+ v- h9 N
int main()
5 y9 I% X6 j7 z$ f& m4 ^0 n/ R
{
, f3 i, o6 n$ z5 Q0 U
int fd;
; `5 O" A& C3 [& k% {
int *mem = NULL;
' N; f0 v7 _8 }9 P* q
1 [1 i5 I) C8 ~4 u9 ^8 u' ?
if((fd = open("/dev/mem", O_RDWR)) <0)
2 U5 h5 j7 c6 O# T
{
6 E3 q, o" `0 S9 | `
perror("open error");
: V4 q1 C& }" F; r! P
return -1;
, z: ~: E; d7 }8 A& {' x c
}
0 b* v; V$ G7 @- @+ I* C5 ^
4 }+ N7 v' i+ g' L3 V% a
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 P/ w* [8 R; I& T ]- y& N
$ x/ ^. ^+ R6 S% Q2 Q
while(1)
8 ^9 k( |& m+ I
{
4 s. m, l6 f1 _3 Y8 h4 E/ ~
read_MSG_buffer(mem);
6 ?( t2 ^! N" Z2 }1 o+ l
}
% S' v9 t% x: n4 b5 o( m% ^* Q4 r
}
: z6 P/ |# d$ ?
' B) [7 Q* P; }- j
void read_MSG_buffer(int *baseaddr)
# t2 M2 Q# N x. f
{
3 L6 `: _& ?# n* Y. o
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 G7 a1 n7 b: s/ Z8 K" M9 `. _
3 @9 r2 s1 h! _, f
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
_) N9 N! X R0 X+ E m2 B
) o+ I# P6 |7 x' Y* s
if(pshreRAM->packet_cout != count_copy)
1 O8 W) M) z* _" v! ^" I/ G
{
3 i, h- x! _( t4 j% i$ \- m
printf("a is %d\n", pshreRAM->a);
1 ^. W( W6 l* w, B) ]2 L l) g
printf("b is %d\n", pshreRAM->b);
9 s) {0 l* [) V- e5 R, n# ]
printf("count is %d\n", pshreRAM->packet_cout);
8 K4 E4 v5 y8 g& I1 f0 M1 x" X& c
count_copy = pshreRAM->packet_cout;
" p4 D' W7 b: a# h$ L
}
1 J5 Q! l" f h! Q! ^$ m
else
/ H Y3 ] |; \9 w3 |1 b {
{
4 _6 D" O: _9 W/ m& O
printf("No effective message!\n");
' m! h( x% _! Y2 G+ d) b' @
}
- F! i* ~9 U* \3 Z7 g
}
8 M/ o9 w+ p: o' ]6 z
- ~" k3 I8 l- x3 a: S( L# w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 p, M9 _- W- q, G' j0 o
; Z" e, e1 E# W1 T' Q/ G1 r
; ~! w9 W6 p7 z4 a
! u' ^2 o7 T: i! s5 I' X5 O2 w$ C
6 }6 \. |4 U9 ?2 b! Q' ?, [
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4