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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) W2 h* c# S2 G- B) c$ e. ~: _: z5 p' g4 v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# b4 b7 D* Q" u% a#include <unistd.h>) O8 f* m; K7 s3 r0 X8 U
#include <sys/mman.h>
9 u% ~0 v; e/ |3 S#include <sys/types.h>- f9 c4 E; p0 P. L8 B2 S# k
#include <fcntl.h>; D& q* o2 O8 i4 E% Y8 _+ E

0 S, e) c! K3 J- k! ~# C4 V#define SHAER_RAM_BASE_ADDR    (0x80000000)   ( ?' U6 I- E& L0 U
$ a% }3 W4 F) b* v$ V
typedef struct
& z$ ~! F# M1 M; M) O{
0 Y  F& v$ x1 ?* |% J        unsigned int a;" A- F  W; y, c) u( F
        unsigned int b;
+ V3 N  T5 k" r( n, e5 N  p        unsigned int packet_cout;
- L1 q( \( k% t3 ^5 ^: o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 Y6 S$ y7 E/ N2 }) w. R7 _. m' Z; q' t1 l6 c3 [8 w+ w$ h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 G: y& n" w! M/ t0 B9 o# M8 V: junsigned int count_copy = 0;
" i) y8 h3 t- @" J1 ^5 u2 m# o# M' |" W' M* t9 e

5 q1 k9 q! R9 R# b( a7 _int main()
: o5 w, h" m% r# |6 t8 K8 G{! ?$ C7 |9 ^1 u2 H
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 s7 n0 R2 O4 d! |/ B; _+ H$ o8 E
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 \/ j0 M$ N$ e9 M) q6 L- e0 Q) }

  I% h% Z. @  Z# U* E% m7 i        while(1)
3 o8 i! v( B- G        {
1 w0 b3 G) n2 b  q  o" |                read_MSG_buffer(pshreRAM);
  H7 H9 n/ s% ?* e        }                $ g% [" R9 M, D+ r' c/ R
}7 @# O) k8 {+ z7 s4 w  ^! s

" S2 t. X5 x( C3 S0 D' Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 C. x* [! F' v. h; I& S6 ^$ p3 W
{
) M7 D0 K# u' ~        RX_MSG_PROTOCOL buf;
) O* E9 U+ l( Z3 i        ! y& n6 B7 b/ }, n8 V1 v
        buf.a = pshreRAM->a;
' q) E$ p( Z. z        buf.b = pshreRAM->b;
' x) N3 z. `/ @" i/ h& J( ]        buf.packet_cout = pshreRAM->packet_cout;" i7 _7 K9 c0 L4 \# o% M
        
3 B3 r3 ^8 V" W7 H9 p/ b        if(buf.packet_cout != count_copy)$ v" @9 y& h4 R4 Y: v$ a  U9 c
        {
1 i( F- k' p! v" q7 s& v% `( A3 f                printf("a is %d\n", buf.a);0 o; A9 A& B) O3 Z% b
                printf("b is %d\n", buf.b);
/ P$ p# }# p. L8 ^) ^                printf("count is %d\n", buf.packet_cout);  O7 G* }; ^/ {% p/ {2 Z
                count_copy = buf.packet_cout;) H: h0 ]) O+ H, P
        }
$ m: N( v1 K, t/ J        else8 @- s9 D' P" ~: `. `
        {
5 q+ m+ p. @( ?; g# |                printf("No effective message!");& I1 i2 ?0 a* _- A1 z% e" ?5 Q+ q
        }4 U) [0 x9 Z- ^- u" H
}0 }# }1 W; e4 F, X% v; F
$ v/ Z  |4 `4 F) d( V& V5 G) N
3 T! N# c5 ?& \* D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 e: `" O+ H/ D使用下面代码,对内存使用了mmap函数后:  A  q+ z  F! I
#include <stdio.h>: S- n3 B4 D, i5 K# ^
#include <unistd.h>) J2 p! g! T- I6 w! R
#include <sys/mman.h>6 a9 h: J0 i, W' X0 {/ f1 k
#include <sys/types.h># h1 V3 M7 M6 z. |
#include <fcntl.h>- G1 x  A- P  }7 W4 X2 b" n9 f5 Y* j
/ S+ _4 U2 R. `- Z. D! g
#define SHAER_RAM_BASE_ADDR    (0x80000000)
# T- |* P6 \; l$ A( _; U#define SHAER_RAM_SIZE         (0x20000)   
- u6 N  V  x/ m+ y8 ~
* w" {7 W4 ]+ P$ m$ M. {typedef struct/ A* ~1 k5 f, X3 k( c! v! @
{5 @. ?; J- Z) L6 F5 C
        unsigned int a;5 z/ ~$ R3 x. `7 _. \% \5 H& n
        unsigned int b;
. b0 {3 q- {4 R        unsigned int packet_cout;# ]  F" r5 K9 |0 r2 e# n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 t* ?5 k8 L% ^% i0 I+ r: r9 X9 O
8 P) v0 h+ @: T! q5 _void read_MSG_buffer(int *baseaddr);
, t; A# R/ ?( ^, _* n- i+ zunsigned int count_copy = 0;6 g9 n' \- c. ^" M0 {
$ l1 s, Y9 H" @
int main()
( }% t8 x; W; q, D) |; }9 u/ u* t{: `" c( l. H4 W9 c; D. o3 {, Q
        int fd;+ L4 F. @5 e$ j9 [
        int *mem = NULL;
; c* r! \0 S* C! |6 t* R9 o' P* k; q0 E
        if((fd = open("/dev/mem", O_RDWR)) <0)
! {4 Q- r/ M- O) J2 {  t- t0 E8 s        {
. T7 P" T1 ?- S$ T                perror("open error");
6 q0 ], _) c  S0 ?                return -1;! ~% d! w1 S4 |8 b8 |
        }3 N- x4 U' S$ X- w5 ^5 o  t
        
) K2 U8 n3 Q' e- x( E        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 y6 k1 W, i0 Q# D$ l. O: t- R, I' F

. o. G% Q* M3 w- w. J        while(1)
1 E+ p6 L! v7 A6 B        {9 j1 o. j0 C( h& n
                read_MSG_buffer(mem);
5 P4 q' G5 q4 X0 Q        }                * G9 r: Y, H7 C3 Y/ S9 D
}
' E* @! N" s& }( l2 S7 U. }9 |1 L% O8 h( f* z
void read_MSG_buffer(int *baseaddr)
, r: l# `8 u7 k' U{' G# G: d, Y$ |5 [, m) y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
% k% N! F# A6 X& Q  o- E% |( J/ U1 z, W1 h4 B  S  Y5 w
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- i2 V1 u% \3 f+ R) f0 N
' s% }' y9 y3 I' |! b
        if(pshreRAM->packet_cout != count_copy)
; B3 v! {4 j; U        {
/ _- O  N& S" M  }" @1 b- j                printf("a is %d\n", pshreRAM->a);1 J/ @' U6 c. k) I" k4 X5 n' N, X
                printf("b is %d\n", pshreRAM->b);: F" j2 m8 q# v( W; T! i* i
                printf("count is %d\n", pshreRAM->packet_cout);
  {; G; O( g8 q9 P                count_copy = pshreRAM->packet_cout;
! U; v. A3 v1 S; p. \        }& P  b8 ^/ d$ S0 q0 D" l
        else+ [9 T2 F% X3 j& `) B4 U* A4 r
        {" u' g% u# d" E
                printf("No effective message!\n");
+ F) ?  A& |4 K1 ?" \) t, s        }
$ _. a& G: j# ?}
& n' d" f2 u& @6 c5 u* R: O5 [3 h
+ p* h  d: U; Y9 T没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
  J* I& t3 [/ {! r, V' c5 X7 b, Q+ y; m( H4 M

3 j! n$ D" F. I4 c( i' R" p8 W2 b
9 W) |- o6 n9 S9 A  t8 @. p. }/ R' P0 V" s6 y9 t  w1 X, ]! N- D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-5 10:33 , Processed in 0.039560 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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