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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # f. a; ~8 N0 E2 D$ i  O/ G

1 m: Y( s' v& w5 z) A& _7 g' x5 nOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% d- A  s( O* T4 @4 {- m#include <unistd.h># a" O0 d! V1 u
#include <sys/mman.h>
6 ~2 @0 r0 t8 {; e#include <sys/types.h>& [* A. L: Q8 R" T. l! j
#include <fcntl.h>
- y7 b6 f- s- D0 a5 r
& l2 V5 @  J, i# |* x( R#define SHAER_RAM_BASE_ADDR    (0x80000000)   & u% p0 W6 I3 e6 `2 `
2 u+ s8 q7 ^7 H! |
typedef struct
+ @. s+ \) m4 F# C# R! s, T  t" t{
2 c7 {" k+ Y2 m, E3 l        unsigned int a;
2 E5 X7 W5 r& O5 y        unsigned int b;
% V6 A& \- w* z8 j5 P        unsigned int packet_cout;5 [7 s. o* E. O* F  h/ H. \! [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. Z" c& x& o$ Z- c8 C" s6 w: u8 s
$ ~* ^2 r5 X7 x) S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ e' d2 }1 w3 c$ R
unsigned int count_copy = 0;
. k2 G. Y. D+ }. L( A
! d$ a; o5 W, l" ~& @+ Z- U/ ~3 K5 o
int main(): N0 S' m' V0 Q/ r4 V1 I& `# F  o* Q
{
  x, G2 T. y/ r# C1 f& u( J        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 [0 F% U& ~9 Q( s. m        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ f9 j& I: y" T6 Z

( {  B0 q! V8 n        while(1)9 D& P% ^. }$ G
        {- b4 j4 g( ^9 n: p7 ~, |: p. r
                read_MSG_buffer(pshreRAM);" u1 o8 e, z# b, @( J
        }                1 l9 k7 Z. {( L" m8 F
}2 c! g6 w( a; \& @8 E% O0 M: z
* ], M! a& ~& Q8 p9 o# ?% [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# B  D  q, ~$ ]2 R9 o
{
) @6 i4 O+ E& U        RX_MSG_PROTOCOL buf;
  H+ J" f9 R0 V% C+ `) A6 h% a7 n        
4 ^( _, c1 r; S, C  Y% j        buf.a = pshreRAM->a;
: O! `! u& G9 N. i: P. j        buf.b = pshreRAM->b;4 i: \* @8 ]  j. Z2 O
        buf.packet_cout = pshreRAM->packet_cout;
1 E9 A0 e5 ]8 u4 A6 t3 l! e" s  |        
9 C2 D! C7 [* E# T3 E* D        if(buf.packet_cout != count_copy)
! |: @) V& \& g8 _        {
$ o6 p2 y, @0 A                printf("a is %d\n", buf.a);
& M9 z. n" @2 e& Y2 v& e                printf("b is %d\n", buf.b);1 Q8 j' N4 U0 p1 z2 I5 b" Q( T
                printf("count is %d\n", buf.packet_cout);. b1 g* H) \- F$ X
                count_copy = buf.packet_cout;
; r. F( d0 U- w* T        }
% I2 e$ U: S1 \5 V+ \        else
( r. B. Q0 B6 I        {1 w6 q: j6 h8 T% T; h
                printf("No effective message!");
5 G8 }: u4 a7 r  A* o3 Y) x& [1 \        }0 g) ~& m) z( D1 ]8 J3 H
}) N/ F: m. ~+ ^& Y
" ?# x* H/ H+ v& `; @5 ?; S

' V8 B, y) J7 I8 i4 z/ O2 L6 A但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ ]8 k/ G( l4 g+ z: R  [' y7 X/ ~' Y使用下面代码,对内存使用了mmap函数后:7 C  \# c5 Q' G, |/ J& X: D
#include <stdio.h>' A( Q" R1 {% S3 L7 c" e# ~' e( U. @' V
#include <unistd.h>2 E( ]; z% M5 _/ w- o4 ?5 b
#include <sys/mman.h>
0 n' b) X2 B- E/ a; T+ D. U* G; ?#include <sys/types.h>
7 B  t# K7 g. W+ s0 A6 Z#include <fcntl.h>6 y0 s# ]: E/ [* m
, D2 {' W" t7 F6 f# R& C+ c
#define SHAER_RAM_BASE_ADDR    (0x80000000)! g: v$ \' m' E) G: C3 u
#define SHAER_RAM_SIZE         (0x20000)     C; D( Y5 k8 J! ^+ a

1 E3 B( m$ }; W8 j1 z! [typedef struct' {' Y- i" X/ W# O; |) R  u3 U
{7 b* j" T/ D- G+ y" C
        unsigned int a;
% j' r# m+ \- c9 V1 w6 a( P' \        unsigned int b;. ?" O& J) \4 C/ ^  G# m4 I
        unsigned int packet_cout;
" J# ~' {% \7 l' y& F) K% m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 k) I: j* D# P5 B" K4 u

  a+ A( B" L0 wvoid read_MSG_buffer(int *baseaddr);
5 Y* U- d) m/ q9 A2 Runsigned int count_copy = 0;
% m; H4 R( P5 A+ V! M+ V8 W: q; }; _( {$ r
int main()
- k: n/ ^/ D, F' |! F, {{
, j! h! c0 s, M        int fd;
' R4 r& {& V2 ~9 h2 E& J1 C        int *mem = NULL;' y. L1 u) J( [5 i  ], G* T
. V) w; Q% Q; M8 {
        if((fd = open("/dev/mem", O_RDWR)) <0)  N9 t  l% F/ u2 ]
        {: Z; C! x+ a/ I( s5 I
                perror("open error");
% {$ N/ B! e1 l" K* |) S                return -1;
& d% b* V. _; k0 _8 d0 B7 a        }
+ u+ T  m. v! d+ Y7 S8 p) m$ f: {        . _0 f8 k. y" B; f4 {0 L
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: `/ N2 k! X" Y8 ]9 \# U  n' r4 ]

& O- T6 K8 u! M        while(1)
* i0 G1 B2 R: z; i        {  q1 }6 @+ `) W% G/ v) g
                read_MSG_buffer(mem);" z; j/ X+ N" |: l2 [( F" r' i5 Q9 C8 L
        }                + W* ?: x, P4 h6 ~% S
}5 V& H$ j& t. W$ u

! K+ |; |' R3 P# @: Z/ E( Lvoid read_MSG_buffer(int *baseaddr)
  W; n7 m+ @2 O, [  i{9 \# I( b$ P' [8 Z# J5 G
        pRX_MSG_PROTOCOL pshreRAM = NULL;! W' \; [/ j# t+ T# C. c% V6 C
! A' d5 ^/ a, H
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, I3 ^6 |0 W1 y+ @. j1 Y
; ^2 z- T6 ~5 G$ W' m7 \
        if(pshreRAM->packet_cout != count_copy)
3 `* R) P) \- [' J% H        {
8 Y" l" d- F* C" b8 W5 Q                printf("a is %d\n", pshreRAM->a);- c6 l9 ^5 ?: X
                printf("b is %d\n", pshreRAM->b);( s- N3 Z) k# F+ t8 F, M3 ^
                printf("count is %d\n", pshreRAM->packet_cout);, O( K# P' [7 P0 R0 d0 H( T. U% f
                count_copy = pshreRAM->packet_cout;2 F% E( n% m4 i
        }$ S* q. v" e) e
        else: I8 H7 D# k9 Q
        {
3 K- ~2 c7 b1 u4 \                printf("No effective message!\n");
' U  j' J/ T$ q        }
- ~8 G+ g; d( N}. S. I( U$ \. q1 {

" S2 `8 v+ L. J, q3 a没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 l9 `& v. @& }8 k9 p
  Y$ ~( A, }4 C- y% b
% n  M& l0 u. r
9 T& F+ A4 I% M5 u

& [1 B5 I! X& e. C8 D+ Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-2 05:26 , Processed in 0.041128 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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