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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , @* s5 e; X  I  |. B
1 H- [) q8 b, T: ?. D& ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: X. D; @$ J! w
#include <unistd.h>
2 C8 J* ]+ ~1 O7 @; b* C' u#include <sys/mman.h>
2 F( q6 U; h& g5 i6 n6 S#include <sys/types.h>7 S/ d, c+ k. Z9 r( z# W+ ]% v8 u
#include <fcntl.h>
3 Q- r$ j8 l7 v3 ]- {& U1 m; d
3 y  b- L  ~% ?) |8 m#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) ~. D9 j8 Q: u) ~/ k$ Y
( s3 l, U' `9 i  z& H7 k+ S
typedef struct
& j' f- E9 ?6 R0 ]{/ j. ]6 [8 z. W, H, n8 Y
        unsigned int a;" m0 d" F$ j8 A+ W- w" ]' T4 m
        unsigned int b;
1 c" _& o9 V2 N8 y# |0 f        unsigned int packet_cout;6 L, Q  Y1 X5 O: Z$ ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 N+ g  {$ b3 J5 e3 z4 q2 S
5 U0 |  p+ G- i9 Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 ^" Y  z: E0 o( ~unsigned int count_copy = 0;
9 R% `8 E+ U5 p) ~* }: p& m* N8 K" m7 \6 f3 n2 {8 r8 n0 v
8 |; P* X- m/ b! W0 E
int main()5 k4 R9 C, i; S; ?6 F1 j1 R: S  a5 f
{
/ {/ u! M9 w5 E6 J        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 [0 O+ U1 l* U! v5 u        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) V8 R% E& S, G# b$ `

7 V9 E9 G3 m/ p0 u+ m        while(1)
. c- A/ f! ^+ C$ O: y, Q. \        {
& G: y5 N4 d4 R8 i' a* `. f  N  x                read_MSG_buffer(pshreRAM);+ y6 K. j* p, u4 }& F
        }               
7 I/ p3 l8 z) M: v0 M8 Y}
9 ]  ~6 r5 @5 T; |
$ ^* P1 n( k% j) C& ?" _void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* O" o3 h9 |9 L" P3 r3 d9 T: h& S0 a# K
{. s6 f% j/ G0 ?5 Y0 f1 Z4 b1 B0 o
        RX_MSG_PROTOCOL buf;
" R4 k  I1 Q6 w% i$ [        
6 [# |- U& w/ ?3 q4 ^' X. t        buf.a = pshreRAM->a;
! z0 S3 @' ?5 x1 H        buf.b = pshreRAM->b;
! g9 {) B. w# F7 _. {& B0 _        buf.packet_cout = pshreRAM->packet_cout;
) c: y$ W, }% ]4 ~/ o# E        
6 k6 S/ F2 Z5 y' X) K        if(buf.packet_cout != count_copy)1 c1 K! B: w% E, `6 W2 F
        {
* ], M! B0 Z  Q6 ]- v' z                printf("a is %d\n", buf.a);* F. U$ T; |3 j3 Z4 j0 u7 R( ~
                printf("b is %d\n", buf.b);
1 L' a* |7 i/ ?; J: e                printf("count is %d\n", buf.packet_cout);3 p$ E' n2 `. Z/ S/ |3 X! X
                count_copy = buf.packet_cout;
  ?' f9 R4 u# v* ]! e0 F6 ^- d        }' X) M% X- \) u+ a) l* D) n
        else
% V8 z# o, ^( U9 }5 I        {! D8 l8 }1 @8 _- Q1 ?
                printf("No effective message!");' ]( j9 |- n# j- ~2 P" h
        }
7 ~1 D. Q) E! h}  Q; ^+ t7 j1 T4 R: a( n

, t* ?$ S% i  p# L- E5 {8 A9 K. G$ H; _0 S: M& [- r
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" d  R  M7 i1 m9 m; R
使用下面代码,对内存使用了mmap函数后:
! @5 q0 X2 V8 m; D( v" Z#include <stdio.h>* p" N5 j% O. k6 i' H; w
#include <unistd.h>
3 ^. Y* ?6 h- z; T#include <sys/mman.h>
5 u  r% _8 {7 `$ z#include <sys/types.h>
  _  M, J" V) r7 r0 O#include <fcntl.h>
5 o, E6 u% |3 i! _0 b9 ?4 Q/ ^1 D" I( C
#define SHAER_RAM_BASE_ADDR    (0x80000000)
: c4 r% Z3 @$ M+ O#define SHAER_RAM_SIZE         (0x20000)   
! V1 f. H) K! K- x# U5 r$ J& ^8 Q: c1 j) O, ~* g* ?7 j
typedef struct
- m# Z; S7 K  x) L1 B{& T2 Y; ?  k$ F
        unsigned int a;
! ]$ N4 x% b( h+ K+ S* q& r        unsigned int b;
% ^7 K- k' R6 a1 O) H$ S        unsigned int packet_cout;! Y: R& W( ]! m9 i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" _7 D! o$ `" Q7 v, W; t
4 y4 K$ u1 W0 u( g- C7 |4 J; Q- @
void read_MSG_buffer(int *baseaddr);! t: \8 E: g7 L. Y9 f1 `
unsigned int count_copy = 0;
- s% I$ c5 U) ~! l3 q
/ f7 U; }; r2 \int main()
, F- U# B1 W# _# p{4 g6 c3 k7 x: x
        int fd;; c1 p7 H: P2 v! r! S
        int *mem = NULL;
$ R. J6 l3 \6 ]6 I
( L. B$ h, s. q1 v2 Q0 X0 a        if((fd = open("/dev/mem", O_RDWR)) <0)
0 ]$ {0 @! U3 J6 l        {
$ C' W6 K/ ~- M3 |6 R7 ]) f                perror("open error");+ `9 z$ O# F4 C: D; ?) g* `
                return -1;
9 p1 g( b6 B' U( Q3 j, r' ^4 ~        }
8 g2 |- l" m. c4 `0 x; k5 E        , V1 O. ~' S9 u+ t5 `2 z
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ z0 ?  b! Q4 s2 J. ^; K/ [6 R, _; n; c" K
        while(1)+ }' v9 G3 J. ~! S* M
        {. g+ e: w; H/ ^1 X# v3 u# t
                read_MSG_buffer(mem);$ l; |# d) ]) h
        }                3 |2 {! Y3 ~4 w8 J6 }+ l& z
}* z2 h1 x) ]( ~% V. q( y

6 [9 v  u$ c  Q6 {void read_MSG_buffer(int *baseaddr); ~  f8 U3 {( N3 ?
{
5 K, I% Y5 ^% A) V0 x- U        pRX_MSG_PROTOCOL pshreRAM = NULL;  w# _& a8 I5 M7 g% j+ ?: D1 k) D
7 F( C6 ~( Z. d5 N  B: ?! M
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" S3 @' g" e- Y& f& E$ ^  x

* S/ X% p4 s( W7 y# [/ \        if(pshreRAM->packet_cout != count_copy)
1 J' f3 @% g1 r        {7 I: ^$ s% ?! Q4 e; C
                printf("a is %d\n", pshreRAM->a);' @* k- z3 m& Y
                printf("b is %d\n", pshreRAM->b);, F& V* {' N7 G0 z, \& I( B
                printf("count is %d\n", pshreRAM->packet_cout);+ s$ Z; }# ~/ W( B( ?6 G
                count_copy = pshreRAM->packet_cout;! K1 _3 G6 U5 y6 m9 F/ u& l% o2 p
        }
# I0 p. g3 b  R3 t' S        else/ _/ r0 a% g: y$ K8 E. ]
        {
" x( u7 U! @1 n, M% j: _3 Z6 Q                printf("No effective message!\n");
/ U' V5 u/ f' a4 V% n; M* b        }
+ r1 Y+ c" \5 ?) s2 j) `" v1 K}
# m4 X$ z' l; t. S- u6 y+ _: z% j9 v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 C( B+ T$ ]9 r5 o+ e" q  }8 A' p
. ]# i+ r4 A4 V2 y) D$ J1 L
+ ]: {+ P7 Z  c( ^, w$ V! V3 `' J; P3 V
6 D* T, x/ E: F- A$ `' _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-12 03:42 , Processed in 0.041472 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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