OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / r' o+ o! I; P
2 i! \' f1 T! h" |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 U: {5 O& i  I( d$ `
#include <unistd.h>$ [" @, M7 o) q4 P7 u% c; Y
#include <sys/mman.h>, L" c# R1 R- S( R5 B0 c8 e
#include <sys/types.h>
4 M& g0 K( m8 A- ]#include <fcntl.h>3 R. R$ X5 f" C! R* s

- b/ E  q8 |0 q* R4 V9 w5 T! f$ x#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# S* D9 T% A. V+ Q0 s8 M, V" }2 [& t$ H2 A
typedef struct
- O1 w* n4 z% F7 Q! f{+ ]% j4 q& }" e' d5 A; t
        unsigned int a;
8 u) A: S6 q7 j0 ?/ x- |        unsigned int b;
0 [, K4 T: p: C; S7 {1 @3 F% w" B        unsigned int packet_cout;
. u$ o5 o8 o8 W; K9 Y: `}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# K6 |7 d' J" ]& v4 N
! K1 k; q" G, y# w, v( k3 R8 K' `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ O0 u. Y1 E* N, ~" Y8 yunsigned int count_copy = 0;
) N- s, V2 I; _( w$ p1 n& A2 h: G
0 m. A7 ~8 R# r- C. U( S9 i$ B7 X; c) @0 f, p, Z
int main()
4 ]+ t+ V% j. o6 ]{. T8 Q0 N7 w9 {* m3 m
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! o8 D& I2 h+ O- G- B7 I$ `7 R        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, g& ~: W5 k" v' R. @  e. }/ B
5 N& @* ]' R% Q
        while(1)/ g" ?1 _- A0 y" n
        {- Z6 [0 z7 e2 P9 s8 }/ C
                read_MSG_buffer(pshreRAM);  V4 K$ @" [+ N+ j$ s+ T% b4 a
        }                ) r4 l* a2 E% d& y, E9 R
}
: X2 o' J$ a! f5 \* k- B- D. [6 K$ p, p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 y! |& Z& d- n& X{6 V" L; S0 P; r! y0 E! y
        RX_MSG_PROTOCOL buf;
  U6 T0 @% W& P/ B0 p5 k! a        5 g) c9 O4 U& ]! m
        buf.a = pshreRAM->a;1 r( Y+ f( N7 F+ k, a2 ^
        buf.b = pshreRAM->b;, Y: e' _& L+ y: @) a! P
        buf.packet_cout = pshreRAM->packet_cout;. e: w7 [, K/ x
        
7 r/ G+ c- K# T2 {& }4 P        if(buf.packet_cout != count_copy)
8 E+ R' i; b* q" P- K        {
8 ^1 ~# }: a0 V9 z                printf("a is %d\n", buf.a);
% {4 C: P0 K6 l1 A3 c                printf("b is %d\n", buf.b);
8 d% a% q, X9 C; M                printf("count is %d\n", buf.packet_cout);. \$ z+ p7 Y# |
                count_copy = buf.packet_cout;: T! L# i  A; h7 Z( O
        }
: V; x& \! H4 {5 h' L! t        else8 m5 N; ^, P9 ~! R
        {
0 Z; i- f7 k- n' f- r$ |  V9 x                printf("No effective message!");
  G/ G; ?4 N( C( I        }6 J. u' d! l: _) U* g
}( n: Y1 C, D+ m: I2 P. [  Y

- [5 X5 M+ g% I, ]" b8 d- M# `& }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 b1 i6 _# i0 [& O  m5 d2 E  i使用下面代码,对内存使用了mmap函数后:
. Y# E( j0 T  k+ \#include <stdio.h>& |8 p6 [3 o) ^# `3 F- {
#include <unistd.h>
  T1 D/ @7 E$ X& C  L#include <sys/mman.h>
" i+ ~2 Y- k1 q+ X#include <sys/types.h>
7 y  l: {! C# `; u- D#include <fcntl.h>, Q3 G3 ?' ~! n6 z2 T: D7 T: g  B
; r9 J6 I7 ~  c! i: l3 ^) \4 W
#define SHAER_RAM_BASE_ADDR    (0x80000000)
& j9 \+ o0 p1 P9 t6 n  Z#define SHAER_RAM_SIZE         (0x20000)   4 A& Q/ h, ~) U6 V) E
8 U$ D0 B% d6 j
typedef struct
7 C' W. A3 B" O  y& R# P( D{
: i' z6 z$ ~$ O6 p2 P8 C+ i4 M( m        unsigned int a;
+ j( C1 W) j3 T6 R# L        unsigned int b;
6 {# d7 [- W# F+ ?6 E        unsigned int packet_cout;
3 ~2 f+ J* V9 x' A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: v3 a) l8 M/ k6 D* K' H5 w- h" C4 R8 x. O5 Y( w  {
void read_MSG_buffer(int *baseaddr);
8 D5 Y7 R% b! b7 t$ |, R/ S2 I# sunsigned int count_copy = 0;
) A( r- }) {% j% i$ ~: x0 O8 X  l3 k$ }1 U
int main()
' M. N, t& e+ a$ @  d; k0 N% J{" ]) R: U/ ?5 [+ V+ J0 `
        int fd;
. }' j1 C3 b7 z. d        int *mem = NULL;
. j" A/ R) E! t" R3 X. Q/ E8 j
5 [! {6 ?$ |! G1 N; i3 z& s( l        if((fd = open("/dev/mem", O_RDWR)) <0)  F$ Y9 B+ ^7 }
        {2 S: m9 A* H; a8 M7 H2 O% C1 o
                perror("open error");
" u: y) ]$ f/ ~" F: v3 t                return -1;
" U6 u# Y: {8 p6 @7 E- h. W        }
2 }2 l8 _4 {) ?        
/ I* M: |0 i5 v0 r( Z& A( \. [/ u        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% I% t; i9 u) a- V2 A+ x

4 R* a) V, e2 R" W) S# }        while(1), o( r1 l6 J* O% I
        {2 E5 U+ [& z* ~: k; {
                read_MSG_buffer(mem);
8 o# S! [1 B8 j0 C% _  z        }                * s9 n: O9 L$ l9 z, ^
}( l* T# v6 b5 W" V$ @3 k8 _3 I
6 G4 g5 q$ E" n, w6 X
void read_MSG_buffer(int *baseaddr)# K( U( ~$ [4 i/ s8 ]0 Q
{
8 ?& o, ~6 C6 ?+ v$ }- p        pRX_MSG_PROTOCOL pshreRAM = NULL;) N# B9 ~9 ]+ Y
9 W) S' Y4 g- |6 |1 O
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 s% n; }$ m& S: |% _7 w  I
7 I; E+ a- ]2 P8 s        if(pshreRAM->packet_cout != count_copy)
% `1 q+ j- _; c  m& P* z        {
3 |9 g! J( ^$ c                printf("a is %d\n", pshreRAM->a);
" v- K7 H$ U/ M5 |. @4 }. `" J8 V  V                printf("b is %d\n", pshreRAM->b);
7 [$ K. l' q: h7 _. |0 m& s                printf("count is %d\n", pshreRAM->packet_cout);) S- y; S' ~# P- N8 i+ B1 K
                count_copy = pshreRAM->packet_cout;
; \+ L% k( q( l) g. T: N0 D        }
6 U, s. F9 K+ ~" M; W  B8 c# d5 `        else
/ Q+ B" K: `: y8 M. M6 A. Y        {
3 c! {2 U/ C' g1 c! t& F                printf("No effective message!\n");
8 D0 |0 H9 [) @/ L6 ~8 x        }/ _% B, V2 }: V4 ?) j" K
}
& `% \5 w6 I7 C  N7 u% z3 q
& h/ S3 Y2 f# h& G. S0 f3 w, {没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ g( `: U& B9 j7 W" [6 F

8 V+ ^- v) K- |6 W8 O, b# }
: f4 C( V9 v2 d/ e+ F3 a
7 A+ q5 [. h$ F' p- G# b2 J1 f! M% i+ g; ?5 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-28 18:18 , Processed in 0.043553 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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