OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4868|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 E* Y" N1 s* ]; w" a4 [* L4 a. H# u3 B" s5 D1 K" ]- J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 r* F5 h: Z& X0 g) B#include <unistd.h>5 O6 K; R: b' Y' d# _* s. T; M- ]( q* Q
#include <sys/mman.h>; n0 {* \0 [1 V/ M
#include <sys/types.h>, |. P" Z6 _# L9 e; b
#include <fcntl.h>
8 V% ]$ v( O) |* M6 [) O
" t) J) X) g  w#define SHAER_RAM_BASE_ADDR    (0x80000000)   . ~& ^( U# U, T" q* y

! C6 q  m# k# {typedef struct6 [, @2 J- D4 @4 ?
{
8 `& X( _! q2 K. _1 o1 B        unsigned int a;) g3 I$ n: J( T' P
        unsigned int b;+ J3 X( m, E6 i) v% w
        unsigned int packet_cout;1 }# y% h: }% n! S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ R4 f3 d/ x* {$ m. b
: `7 W$ X7 X, ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 C' I+ `& \. g& P" a, @unsigned int count_copy = 0;. X6 C9 S  [) W/ Z% y! H1 Z7 p
% s9 w$ U/ @0 j! K% |+ P6 c, g

% E' h; U) v/ J9 G! ^0 e7 Z2 P% Uint main()
7 G: N; N, p4 L6 x& L{  i/ W1 H: E+ Y9 I+ J: S
        pRX_MSG_PROTOCOL pshreRAM = NULL;
. D3 \- X! P) I# i1 L6 B        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% }) B; H! O; Y  K: _# ^6 ?
! T6 B* g& Y+ y; d, n
        while(1)9 N6 k; n! z$ u8 u
        {( T- \  ^/ D! W) b
                read_MSG_buffer(pshreRAM);
! o/ `: L3 Z+ z( \: J5 v; `* |/ p        }               
! @1 M4 w4 S% g}
2 b  I, b0 n6 ^+ E. m
& n- G' ?8 Z/ m6 i, S0 N" o, bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 A5 B! K7 f: \( @/ r. N' p$ B
{
- j  u& D( A5 n        RX_MSG_PROTOCOL buf;
. X8 K+ F, @5 j/ \) w, G+ X7 U        
& q1 q' L% h7 Q4 p0 C+ M5 c        buf.a = pshreRAM->a;* A+ W0 s: k' X8 m0 j
        buf.b = pshreRAM->b;
, k, v% X' L9 J$ e/ }: v; c        buf.packet_cout = pshreRAM->packet_cout;
9 P3 L- f- R2 D: i; _        ( M: m) {! m9 H& o7 _
        if(buf.packet_cout != count_copy)0 ^0 e8 P9 g$ D0 a: ]
        {
  P6 r  o0 r3 j                printf("a is %d\n", buf.a);
" w6 A6 t* b/ b# O; }. u% c                printf("b is %d\n", buf.b);# w: u2 i& K: }+ P
                printf("count is %d\n", buf.packet_cout);
. H: P; S  l% _                count_copy = buf.packet_cout;
' n! Y3 S6 m1 [1 q7 y* g9 V        }3 |/ L+ n% A: t" ^
        else# w' K& H! r3 }7 i" h- C
        {
0 E. o2 w, Q/ j; o                printf("No effective message!");
8 G5 W/ Y( a; J! p; U3 f1 E        }
3 P* g- N( ~7 K. K6 l}
, y; A9 w/ L5 ]5 d" [, z9 _9 A- F/ i

& R* v5 o5 k3 i0 Z; E+ O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( J2 p* S( @* z
使用下面代码,对内存使用了mmap函数后:4 k/ h6 G  K4 A$ H' W
#include <stdio.h>  ?4 j; |9 A6 P1 s0 ^5 F
#include <unistd.h>) C0 f* ~6 m+ \( j& R6 t- f
#include <sys/mman.h>' a6 E; }% s. a& R1 S
#include <sys/types.h>
8 H* w% }- u' x7 T#include <fcntl.h>
! h; s% ^" a# T: ?9 w+ D
. k! u. n& D0 X& Q* T2 Q! @#define SHAER_RAM_BASE_ADDR    (0x80000000)
; }7 ?5 Z; B# _3 l#define SHAER_RAM_SIZE         (0x20000)   ! ]) H- c2 {4 k5 I7 S3 l9 M

$ e* v- g+ F( E5 Utypedef struct
  z5 k9 O( U5 V+ p4 L{/ o" z, S( R, h8 L
        unsigned int a;4 D9 T; V8 K. Q; Y- c* J
        unsigned int b;$ Q% U3 u. ~! K; z! E
        unsigned int packet_cout;  G* K9 T/ _) @$ I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( X4 V! F$ n4 _8 \5 c. T! |6 w5 q+ P6 y  F/ i5 Z$ h2 H
void read_MSG_buffer(int *baseaddr);$ z' d, N' @) v8 I
unsigned int count_copy = 0;
: i2 C  u1 N, E' \4 {4 ?; M7 j6 n/ Q& y* y3 G% I& B  r
int main()/ x. n" y& A% f" E0 L# E5 |
{
8 F* ~" n# I! Z, L9 S+ b/ R        int fd;
9 O. O- D, [/ e0 W! y1 S( e        int *mem = NULL;
; }7 d1 T  M2 d- `; N9 A7 a
3 {( k7 }. Q2 s% ^        if((fd = open("/dev/mem", O_RDWR)) <0)2 g5 [3 n# v! V! K- W
        {& n; O5 \5 ]0 a* K3 u( v+ c/ `
                perror("open error");
8 m0 `) [% Y9 @% s- r9 D! _  i3 l                return -1;
! J: h0 R- B  d, B! X$ v3 w4 E        }, u6 S% |* \5 H1 O% X& J
        
  \; H3 D" n! V7 g8 |        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( j. q3 ~7 ]5 j: a

+ F5 ?- r: W7 ?+ m& a/ x, e+ C        while(1)
. a5 x9 O' b, p3 |# Y6 O3 Q+ e        {
3 T  k& _; ~2 \. @                read_MSG_buffer(mem);
9 J8 ]9 Z9 l' e* E$ h        }               
4 q9 P4 \) v; G3 y% p! D3 }) I}( C* m; w  A5 u3 V
; Y+ L: A" t$ c( _
void read_MSG_buffer(int *baseaddr)) H, Z5 ~. i2 T
{9 m$ {+ K" ?2 T+ ?8 j0 P
        pRX_MSG_PROTOCOL pshreRAM = NULL;1 W/ U2 d1 ~1 x, t' [/ \
4 @3 I& q) g& B: L; F8 U1 a4 Z
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- s8 `* E% ~7 _+ \( B  U% o0 N3 b/ q, A6 @& _, h5 {: t
        if(pshreRAM->packet_cout != count_copy)
" s9 E* s- I, b3 i% ?( }" G        {( K0 \% T  Y) _& ?
                printf("a is %d\n", pshreRAM->a);
3 ~6 V: U  R' z0 L! x8 c% X                printf("b is %d\n", pshreRAM->b);
- O" u4 @" }3 b, }2 E( _, r                printf("count is %d\n", pshreRAM->packet_cout);
0 q7 D  G3 }: Y; h5 [; W                count_copy = pshreRAM->packet_cout;
% \( A; N! V: f4 U        }
& Y- q' g) o, z( d        else0 ~  x0 D# K6 X2 @! N1 O  p
        {
; v3 T( k. L1 w. O  a4 h: k                printf("No effective message!\n");4 Y* Z' e; i* q4 K+ o) K
        }
: u! Z2 l3 A$ l6 |4 v. U# q0 ~}* ~( X0 o1 b) a1 \3 E/ l
7 g5 Y$ \2 v/ c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
  E( i/ h( D7 V0 x$ b0 h8 y; l' \9 K3 U% ]

, Y' ~* i/ B7 J% \% b8 }; [8 @1 y4 a! P" b+ p. x

; k* h  c8 f% H8 T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-8-4 18:21 , Processed in 0.034978 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表