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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" O% U$ O; T( M
( b7 r1 L" P. P( |) D0 P4 v9 V8 TOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- x& F2 {6 Y2 s9 M' k& ?0 z#include <unistd.h>
1 e3 L' i- T1 l! D7 l" ]& j#include <sys/mman.h>
, |- N" [+ n# y" y#include <sys/types.h>3 n0 ]; J) b* c
#include <fcntl.h>
" p" `' [" F4 A- n& T$ U: U- G" R# t
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; u$ r9 e4 F$ S" e# t# P# Q  Y4 S1 c2 j% P9 V/ D5 r
typedef struct
& _8 ~4 N0 C: _2 x, z( G9 v{
( D. V3 t, v: Y- f        unsigned int a;
, B6 \+ H3 R7 v4 v5 C        unsigned int b;: [+ |  C( g; u8 A
        unsigned int packet_cout;
5 K9 U* i) ~! b$ X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* i' l) n9 [4 r: V3 C8 e) F  `! w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 h" a( f. y+ w7 i& u! d
unsigned int count_copy = 0;( u2 Y! ^5 I( f4 g1 `
8 p* ~* |* @6 J

: h( \; J8 `9 \: Wint main()% ^7 F. L( v) A- {: u5 p
{
4 a- S  }" r8 ]5 {# G3 K        pRX_MSG_PROTOCOL pshreRAM = NULL;) \: ^+ P/ B5 ]. |3 w- r
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% i+ y. B/ T: b4 N) I' U  \. i' f. G8 Z' o% Q, w6 {7 Z
        while(1)
2 P/ G* _: f7 ~! `, _, `7 |        {& h- ~0 G' e0 C9 z, g* I
                read_MSG_buffer(pshreRAM);
- H* x- g, a- N) r6 V! P% z- x/ N        }                - }! ?" ^. _6 t$ }0 ]
}
' s/ ?/ @- M9 V- W# n0 R1 K/ U9 l! `9 H/ t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' O$ X0 H" x8 i1 Y4 v# D' P7 J
{
, U* V' V5 d: s* T5 I" ]) D        RX_MSG_PROTOCOL buf;2 `0 D! n& x" d
        , E) S0 w, v9 O) d
        buf.a = pshreRAM->a;. u1 [8 s* \3 v& e% o9 `3 v$ x1 d5 U* |
        buf.b = pshreRAM->b;' I1 i- l8 K: P+ n. j2 E3 T
        buf.packet_cout = pshreRAM->packet_cout;
0 Y! s5 M* \( Y+ L        $ I) [% V! _; _- F0 E
        if(buf.packet_cout != count_copy)# r  q2 W8 H$ k. i. S
        {4 I. `' n, P( M8 q( s7 c& f$ A, e) z
                printf("a is %d\n", buf.a);
9 v% m7 G$ }, R& u8 r2 P0 K                printf("b is %d\n", buf.b);
. ^0 T( `5 N, [" [, P                printf("count is %d\n", buf.packet_cout);
+ ^4 ?1 W2 p  z; Q- V                count_copy = buf.packet_cout;5 c! W" q3 y7 M3 k# a  r
        }: I4 R  b, o7 O; n4 ~( Q+ x: j
        else
$ p' D' @: j+ v. p: p' L        {9 k9 B0 {: g, r) o6 h$ A) G+ E
                printf("No effective message!");
  X, q. G5 I# k& x5 X1 a1 ~, s        }+ s, f4 F9 m: u" I" S# }# o7 R) S
}
* i7 h+ @  F/ Q
6 e9 F5 E2 H" C: v  x8 o
& H0 N: |. A7 E4 d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, u% B* l6 T, t7 U. N3 f
使用下面代码,对内存使用了mmap函数后:# ?+ G5 Y; B! J/ D% \' C1 f" M! x# z
#include <stdio.h>( d$ W% |/ o' J0 R
#include <unistd.h>
6 @: P% I- y% z) N#include <sys/mman.h>
( P/ _! P% k7 j) l#include <sys/types.h>% \$ }0 {& U% U8 l; L* L
#include <fcntl.h>
6 K1 D0 E0 N: c4 x) \) p
' R; S3 B+ C/ v. Z! ^#define SHAER_RAM_BASE_ADDR    (0x80000000)5 H1 O0 E% R$ j' |
#define SHAER_RAM_SIZE         (0x20000)   7 `* Y4 ~: O$ Q$ W

, g1 I& ]# O; J5 ~typedef struct6 z$ r- l8 Y; A: r1 z8 S: `9 r
{
( k$ r; f6 g9 o8 V1 d* U; A' [2 b        unsigned int a;
$ ^# P. c2 E$ T- K( X9 ^        unsigned int b;8 t6 p& @; {( v" Q" K
        unsigned int packet_cout;
, K: n- E, Y, E. }& Z3 J6 z6 X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- I" }: e+ ?& U* i+ P7 k, J8 P( d; A5 p0 z$ i) q$ {) ^
void read_MSG_buffer(int *baseaddr);
, K7 M! L* |4 I; ?unsigned int count_copy = 0;1 B; U! {: h+ ~' A+ c6 z
  O: U6 V' P  x1 ^* _
int main()7 {$ h4 R+ t# c
{
; R' B0 u% L+ q# N7 S3 l        int fd;
- d( h5 m0 `0 S% d5 |$ v        int *mem = NULL;
* X( H2 W. J. p/ U# Y' C
, S; p* G, `6 `        if((fd = open("/dev/mem", O_RDWR)) <0)5 A4 |  R" E; l2 @/ h
        {! K" o! v' H; i
                perror("open error");
, ~; n& `% v8 }7 ?0 o                return -1;
+ @, P! L" h, y' G        }; _5 L* M* P) U+ C- G
        
* _0 M7 C1 K$ Q+ |0 t* T, K        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ o: C$ V% e' a( P. k
9 Q3 F+ l' O9 _. E5 ~1 V$ y
        while(1)
# S. E/ V1 a3 C. O, D0 w0 N2 x        {
% G/ O: t. e3 ^6 S3 s" `( G. T                read_MSG_buffer(mem);
$ U. j: L: G7 _9 I        }                % O2 b( h" Q0 l$ l
}4 K& a; A. x( c; b3 @
! y! j5 W; Z. Z$ U0 M' d, k
void read_MSG_buffer(int *baseaddr)
; K& U1 F9 I4 f7 y; X; ^{
( J2 `- H/ E( T/ X' m. c: ^        pRX_MSG_PROTOCOL pshreRAM = NULL;* m! T, K2 @- [* k
, B8 {, m! E3 I) h
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 r4 y( W. d# i  R+ F

  x1 K' N( s- X! X6 s" B+ \        if(pshreRAM->packet_cout != count_copy)
' f/ p& T, y7 @: U3 K        {
! D1 C+ L: s2 |2 p                printf("a is %d\n", pshreRAM->a);
6 l0 `$ e. O5 s# D% ?+ ~                printf("b is %d\n", pshreRAM->b);2 ]( G( U. a* d9 z5 J+ W% a
                printf("count is %d\n", pshreRAM->packet_cout);0 z) l. R6 }& F1 k
                count_copy = pshreRAM->packet_cout;
! T& ]7 `4 h$ C- r8 o6 F        }
! G" o. z- m0 Q8 G1 f        else" J- ]0 j. X0 |+ Q2 o3 ]
        {& B) D+ Q0 W0 k
                printf("No effective message!\n");2 S& Q2 P2 C; b- N2 v* e- t9 }8 P
        }
5 \4 `. ^% m, t2 D+ t7 m9 P& D1 }0 v}2 H) C" b- h' ]; l

/ J1 Y& n) T9 I; p! F6 _6 U: _7 M没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) `4 Q; q8 p" a2 ^2 B5 O5 B! _
" h2 d3 n! v+ @2 I, h' ]1 ~
4 x5 y- }. S$ L8 Z( a$ P/ s) i+ n4 U/ V; i- b6 W

; [" f( @8 `0 [/ p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-27 19:06 , Processed in 0.041111 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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