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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . Y1 J+ R4 f7 q

$ Y' E4 a- k" W2 r. s* Y3 g6 }OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% ]! t- q8 T' M$ p7 r
#include <unistd.h>
: ?, H) V+ R. }, }6 ]; l#include <sys/mman.h>2 M1 P! l: p8 ~0 x* o9 `
#include <sys/types.h>
  Z# c! t9 e% k* x8 z# f#include <fcntl.h>& y0 V# g+ a7 C3 i; N- Q

  J" J9 M6 o( M" n  f8 {: ]#define SHAER_RAM_BASE_ADDR    (0x80000000)   3 v* s# t" m! A' [
* f- b0 v* C: y# \  o! u. e
typedef struct
0 W& \* q7 S( P# e{
- F) n, N+ o! z2 U        unsigned int a;! r& S% @9 E- I
        unsigned int b;
3 [' G. ^+ L0 H5 C  \( O        unsigned int packet_cout;
( i9 J5 `& s+ r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) T( ~5 T' |0 ]$ U8 G6 a1 D
  T) G4 d1 `. [& U5 P& P: c$ svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* T" \2 m8 L5 i% I& u5 [unsigned int count_copy = 0;% c% H, I3 _& A! T$ Y

, U  P7 C# d+ l1 A; ?
8 m) r! u: E0 i" u2 [int main()
' f9 {' g* u1 X{
& K% n7 U. A3 P( D* ~! ?' |        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ s, d4 p" S* U% m        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' O$ o& H  J- K4 U

$ x0 q, `3 I; f# Z) |        while(1)
6 w& ~9 C2 n- X+ p5 N  A4 j  e        {
! R8 B6 P( O* ^# {9 i# ~/ w                read_MSG_buffer(pshreRAM);
1 F9 M6 u) y* p8 s3 Z; c" x6 J5 B1 k/ ~        }                5 I" j1 y4 w, h
}
" l9 H2 N5 ]* G' Y5 g7 V8 j
% g5 s7 ?+ }  m0 R0 V7 bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" h2 N; n: n1 }3 Q* ~4 I{0 P/ `0 ~& o9 e* L
        RX_MSG_PROTOCOL buf;# G. b+ U6 I2 G4 L4 h
        # G+ I9 f( G0 e3 L1 D
        buf.a = pshreRAM->a;
4 T  A# @2 d# B8 w" C, j' h" T        buf.b = pshreRAM->b;9 l3 z5 ^' ]" P/ g0 d; F
        buf.packet_cout = pshreRAM->packet_cout;
3 I+ c, R: d- [. q; G2 L        # J" o: c# G5 R" m' O
        if(buf.packet_cout != count_copy)
* E6 C1 k; M$ N0 s' J        {0 ?6 {/ ?2 V! A' M
                printf("a is %d\n", buf.a);$ @4 D1 U) g4 I
                printf("b is %d\n", buf.b);7 x1 A' b& a3 u* {7 ?9 I; G  Z; z/ @
                printf("count is %d\n", buf.packet_cout);+ d/ z7 A* y# ?  u& Y# q; @9 E4 ?6 ]
                count_copy = buf.packet_cout;: ~# E3 i( j% [; M7 j3 D3 e
        }
" k+ Q* i+ U6 D+ d/ L        else
. z$ j6 t; R5 `+ w        {
  }# V8 G. F, P" o' u                printf("No effective message!");7 M6 I* V7 W0 f
        }
4 X. u7 j8 m4 O2 y- `}1 `9 c/ b1 _5 x7 H
. w! X5 c2 [9 J  A( R$ ]/ t

, B+ T1 S5 s: z4 \5 w9 `3 |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; n/ U1 M4 o1 w0 Y% ]$ a+ [
使用下面代码,对内存使用了mmap函数后:* R/ ~" {/ J' ^, I) A( J
#include <stdio.h>6 K! b2 |) Y1 t
#include <unistd.h>7 ~4 N% I6 x1 f; A  C/ W
#include <sys/mman.h>
/ Z# \7 L5 }1 B- e2 |' p#include <sys/types.h>
9 o! c" f  J% J7 s#include <fcntl.h>* l+ l9 M  l; Z) N! b
, c; r' d" e+ y. J  f2 s
#define SHAER_RAM_BASE_ADDR    (0x80000000), w+ L+ f# U0 N2 Y2 p* Z" m3 W! _2 ~
#define SHAER_RAM_SIZE         (0x20000)   3 \' E1 ], V5 t! T+ D! N

$ p0 y9 \7 i  Ftypedef struct. J' F& m4 G8 l. N, t: {
{  d* C8 r# M* R5 T
        unsigned int a;+ ~8 U5 j0 e0 V2 z
        unsigned int b;5 x! a+ x# ]+ q6 D2 Y" C( _+ T
        unsigned int packet_cout;
9 Z1 Z: Z; I; Z4 g: Z8 k4 L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* m$ ~; b' B) A  i

1 m" c/ K2 y% g) g( Nvoid read_MSG_buffer(int *baseaddr);# Z3 \- ?' b2 E' _
unsigned int count_copy = 0;
# N7 t$ v2 d* _/ w/ q7 j- T5 O/ K  b$ d; m$ c
int main()$ f: p" K; Z( o  a9 ?! E4 g& o
{  W9 J8 A( M1 |' @
        int fd;
. v/ p$ ?0 @9 q; z3 U+ a( o+ Y        int *mem = NULL;
- X6 C! c0 a# k, r2 ?
* O/ g, a3 ~" q; d! I  o) L. r        if((fd = open("/dev/mem", O_RDWR)) <0)( L) ~/ z5 [+ V+ y
        {% ^+ ]( O) Q' ?# R. y
                perror("open error");
) I% W2 ]  e+ W( u9 _/ S/ l$ w$ B& S; z                return -1;
% r, l' q2 P( M! _9 \- @/ Y        }
* v0 T3 n* d; V: i* z" @        ( D" j" y# b# G8 p4 S  o
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% r! l' A2 f3 |( a

. c1 S5 E! [7 r/ Q; m) L2 V' n; T        while(1)
' P$ n2 S. s; K        {
! t, U/ e. K5 y7 t6 g7 S0 N                read_MSG_buffer(mem);
( l9 ^7 }! g. Y* Y        }                ( c! M4 N: l, k. P2 n
}
  m1 ~- q& B# v+ W; c  S. C5 h! {1 E1 ~) ?2 ?7 ]! Y( |) F
void read_MSG_buffer(int *baseaddr)
; x- ?8 _4 T9 J* ?5 u  A* Z2 n, R{
* m$ r% J' b! e8 R8 R1 y        pRX_MSG_PROTOCOL pshreRAM = NULL;' N6 D+ p5 U- E1 `3 V( v* w
' d& g1 N$ [- o+ w+ m
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& y- Q& q( U' M( J

1 j- H# l! W( \: w! M5 M2 k        if(pshreRAM->packet_cout != count_copy)( s7 K4 D# _$ v0 {1 N
        {( F6 N* Y  S& r
                printf("a is %d\n", pshreRAM->a);3 y. W5 e5 Q0 K- m
                printf("b is %d\n", pshreRAM->b);
, w" q6 @% |, }4 R: w" W; v                printf("count is %d\n", pshreRAM->packet_cout);* B' L. h2 D9 N6 ^2 L
                count_copy = pshreRAM->packet_cout;2 _; _' P5 ]) Y% t
        }: ^/ o3 f% i: h4 Y) ^
        else
( k$ P* Y: Z9 y- [3 @1 Y* r! F$ h        {
4 z7 T' q# {1 h& h: g% _3 z$ Y                printf("No effective message!\n");
, F: G2 z: H/ m; z        }
" P& n: P! E  W; j/ V8 N}
9 T, h$ [0 H$ f' V8 g0 ?; i0 S2 L0 l" E. n6 n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" m2 c4 ~6 \$ m& E2 @6 S- ?% h! P8 c8 C$ g4 Y8 T/ J7 @3 F

/ a, y- Q' o8 ^
# }% w& X7 V8 v
; D/ A  z1 g$ r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-16 03:53 , Processed in 0.042477 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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