嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- x4 j( A$ z2 g0 y. a7 Y9 L6 Y' F$ G1 G1 J6 W' e
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: L$ |' M. Q% F+ ^( ]#include <unistd.h>( V5 k, D# y, }5 m& {
#include <sys/mman.h>
# S5 }0 s) U  y9 w' x#include <sys/types.h>  x' n- P8 S. N% ?5 E2 s
#include <fcntl.h>* m7 l. c( b" j+ }+ V8 \+ B
. Y; i; Z& H, q5 t
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 e# k' M& t; }1 g+ i; W; H
7 h2 i3 V- T5 O/ z; Ktypedef struct
$ }1 ]/ A9 z) V+ C  }! f! T{
4 n* J% K: j$ t! \9 I0 r) L# T* q        unsigned int a;
/ P4 V& q( i1 g% C6 L  }8 c        unsigned int b;% I2 f/ J$ @* |; v- G
        unsigned int packet_cout;( K4 ^2 X3 p0 e9 p! m+ A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& i- u3 e/ o; O- x  Q$ x
# N% h" \% w  Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! n- [; d3 x( Q& s( r
unsigned int count_copy = 0;$ M' z: h/ |* G' ?
% ^0 A9 y# o3 B) I1 m. r/ h! J
' y: M3 W/ p0 E; i' t6 j/ M) L5 y
int main()
5 g. L" W3 Q& H6 s: v5 d" k{
7 H1 z0 H6 I; z: r1 d3 y+ A3 S        pRX_MSG_PROTOCOL pshreRAM = NULL;: Q( A: q+ X0 M/ [" u/ [6 b  X
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* f# s6 c. g# G  T! }6 v/ f
- B4 ^9 `, i; u7 {* Y
        while(1)( a0 U& y  B* J
        {
' b; h% E* n$ H: L0 O# ?                read_MSG_buffer(pshreRAM);1 h8 s0 v" q; b# T6 `
        }                6 `6 ?8 V; B( _! Z3 I
}
  o2 s8 r" `; b! \" }  t, N9 C2 ?7 C0 }- \8 }3 i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& }0 _7 K" H. f1 m/ C# g! \
{
5 ^$ A5 J1 P4 N/ J        RX_MSG_PROTOCOL buf;
- ~2 T9 V8 J- v8 i1 l# f: L/ T        
/ Q6 R( A% E2 T0 n8 x6 b        buf.a = pshreRAM->a;
2 {4 ]: [9 v# d        buf.b = pshreRAM->b;) ]& F. [. J- K! c) v. y
        buf.packet_cout = pshreRAM->packet_cout;
$ ^8 o- D2 t# _, Y. m5 P3 c        
3 h0 E2 P. }5 I7 H7 Z/ _        if(buf.packet_cout != count_copy)
  N3 A; O* [3 E/ n        {4 V  |, I2 h/ \( a9 u& e
                printf("a is %d\n", buf.a);
' A6 F. F, q/ W# w/ O; M                printf("b is %d\n", buf.b);: f' R+ Y1 `5 m2 u# o/ a
                printf("count is %d\n", buf.packet_cout);
" S) N8 u/ E- O! B                count_copy = buf.packet_cout;
5 ^3 @% [7 s+ |        }6 u4 x) a4 f5 p$ ?1 p
        else
6 n$ j. d: k. A. M5 J+ X        {
8 d& [, s1 i% X) V                printf("No effective message!");5 w' J4 h5 N4 F' z# M1 {9 A
        }' F/ k2 u* S' O# [
}
% f* N5 U. K% V# ~% d2 {4 I: @! l
1 p0 @) _" F7 |( }" ?: r4 q  X& ~; T* Q4 q  }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 x% O$ v5 j$ _; {( U使用下面代码,对内存使用了mmap函数后:) ?( n  Y! D6 }1 [. V
#include <stdio.h>" ]1 M: c" B' H% d& ~6 M
#include <unistd.h>9 P4 c! U/ d+ n! Q# z
#include <sys/mman.h>% n) O  w3 s; m% ]$ e* P7 ]
#include <sys/types.h>( e- t2 s+ m0 q0 m2 J% r1 n
#include <fcntl.h>: i1 I4 H1 F4 `2 G+ \
: J5 Z: e" }. u
#define SHAER_RAM_BASE_ADDR    (0x80000000)" ]+ ?. t  y8 A+ z  E1 ]3 [/ m
#define SHAER_RAM_SIZE         (0x20000)   $ M% f( s% E0 s( o. B* T
% D4 S) b2 A- Q1 v0 Z; Q
typedef struct: s. G! g; q# ]9 Y; e
{# U4 v2 I$ o* ^9 B( F$ F4 f( K# Y% Y
        unsigned int a;: D3 \- N& u! l1 r
        unsigned int b;
8 K% j1 u% e- Q7 r7 W        unsigned int packet_cout;
0 \' C! {; s+ Q) B$ }0 J  H2 X+ }5 w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; E) J$ g  _* U7 b9 ^: a5 G, [1 \# j5 u) t2 X0 ]: Y2 Y0 `6 I
void read_MSG_buffer(int *baseaddr);
5 \, N. I' H& x( j. I! tunsigned int count_copy = 0;. a6 U8 K5 [% s4 X3 D
1 L' Z+ ^# V% S( F0 u- A. \* W: {
int main()( L& {/ z% m9 U
{, R+ }' P" h, s+ n! V! |/ {: ^5 C
        int fd;
0 e+ O, T5 c: C( {/ Y2 D- T        int *mem = NULL;
9 I' D- ~$ K1 S  g7 g+ g4 R
/ `' T3 h2 `. X- w% b% `        if((fd = open("/dev/mem", O_RDWR)) <0)
* {% U7 j7 h+ r- t4 e9 }# }+ b        {4 `6 ~% z6 N' o% l
                perror("open error");
0 X4 O; }: T/ M3 d7 r: ~' l                return -1;
* y5 u; C' ]$ i& ?        }6 ]; T( j7 [- L  j% j) H8 ]
        
: b5 A: G: b2 y7 [3 l( G, B0 A        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' k3 N( r+ u+ c' ?  s) Z/ M. L5 B+ c3 K5 V; E! K! G
        while(1)
3 n  o- s4 w! ^4 c6 p$ `; @/ D& `+ p        {) m( k% \! {# W/ {- L1 `  t# r
                read_MSG_buffer(mem);
" K% c8 {9 _$ ?) Z& `( Z        }                ; O7 }; u$ u' ]' i& J
}
1 S" R0 E( @; P4 Y1 r- c; Z4 a7 ^) R5 Y7 o( k8 x6 B
void read_MSG_buffer(int *baseaddr)" O0 H5 X  H/ r/ i
{
" F1 l  l1 D. Z        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ Z% R" [/ [1 o
( V! a% A' A7 B2 s+ A        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- d. b' h8 }- I# ]

' q3 z  c4 ]* o5 I# L! s        if(pshreRAM->packet_cout != count_copy)
3 `  |. J! C/ R        {
8 n* n% t7 _( |, Q                printf("a is %d\n", pshreRAM->a);
0 M5 D, k' C$ m. c/ y                printf("b is %d\n", pshreRAM->b);8 j/ _6 O" T& k5 ~
                printf("count is %d\n", pshreRAM->packet_cout);, M$ t$ y% I8 r+ `7 x# G9 J0 @
                count_copy = pshreRAM->packet_cout;* \; ~6 p& |$ z- D3 J4 ?, Y8 f
        }; T7 F: @  x( ^/ O: M
        else5 @% R1 X2 V9 b$ ~+ R! N
        {
& c+ y3 i6 v3 j! s$ l" P, ?                printf("No effective message!\n");
4 ]  ?$ T5 d& Z9 W( J        }$ T5 \# L! l% d0 m& Y
}
! T* H& I+ i3 W7 {( l9 N4 p4 A% W; a2 ^; x3 m- u% j( D( K: D! ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 `7 j1 L. U; y% ]8 h4 N' L5 u

& p1 X5 F/ ?7 s$ _5 r
/ O: b* I( z7 y) Z7 p* M5 Z5 R4 Y; @' M% e- X# y

  `; F' i' W0 o; [$ h- P




欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4