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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - ~( n8 @7 S: V6 t& B6 E( U
- T7 G& z7 L  z" H2 [& i
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" a4 O5 s/ `  P) E#include <unistd.h>
) q# p7 M* B0 o! T; i1 s' A1 Y#include <sys/mman.h>3 j! }3 }( Q7 T/ l8 Y
#include <sys/types.h>' T% a! s6 m6 ], f- |1 s0 j' }
#include <fcntl.h>( O/ Z& {& P+ x: d' \
% ?8 ?) j1 F+ K4 s4 Z* E
#define SHAER_RAM_BASE_ADDR    (0x80000000)   0 w6 ]# d1 Z6 m; l; G( Y

( ^) |- ^  Q' w/ z+ htypedef struct& f* v+ o0 |2 y% l
{1 S& @1 J4 a2 H3 e0 ]- s
        unsigned int a;0 e6 f( f- U& Y8 m
        unsigned int b;
" v3 T+ s, U; |        unsigned int packet_cout;
% W5 ^, D8 m7 a5 q7 d  S9 N& o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' [9 M5 W/ D) p. x+ d1 O4 R+ n  m3 c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 y% i5 q# X: ^8 c
unsigned int count_copy = 0;
1 Z9 S9 D# G* J5 k9 P' P
- K) e; I; d' ?: s, P& S" R8 F
" a' D6 O. y8 p' T2 _  Hint main()
! V" ]) n# m' G/ w  S{; o2 a" [3 t% u6 P* b
        pRX_MSG_PROTOCOL pshreRAM = NULL;2 L% c3 z3 Y# J! u) R
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" X3 R3 h+ @3 h, i- H8 m  U; q
: J: h+ w: [/ j        while(1)
" d5 ]) |+ Y9 \  a        {5 H+ ~3 ?3 X8 A
                read_MSG_buffer(pshreRAM);
1 s3 d, K  B* w2 z        }               
9 z1 \0 `! C# J& k}% r7 ]% U1 [. `1 |

: N" m  j- M8 r3 u7 n3 Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 l) P4 y( ^8 d1 e5 O/ V$ q, p/ d  k{7 _8 Q4 z, h  a1 _- U' U
        RX_MSG_PROTOCOL buf;
& _  \0 K" }9 q" G" o6 \! Y7 e4 p        
1 @# L1 O5 e6 w" j% a6 Z4 \0 P        buf.a = pshreRAM->a;/ R7 n( M* l! x% Q$ R/ u
        buf.b = pshreRAM->b;; x9 s% b; Z. j9 r& z; K
        buf.packet_cout = pshreRAM->packet_cout;) z1 e2 C+ P3 Q5 E$ c
        
  \% J+ Y0 S; V9 {+ @3 m        if(buf.packet_cout != count_copy)
% s) X" r0 c1 j6 I4 f        {( E- z& f$ Q0 ?) |. I6 ^
                printf("a is %d\n", buf.a);" @7 Z1 H6 Q( w- \( S
                printf("b is %d\n", buf.b);
2 R1 J1 h# I6 X2 ?& {                printf("count is %d\n", buf.packet_cout);
6 p' m  C1 T  T& q9 x, ]: w7 j                count_copy = buf.packet_cout;3 g, U: a& U3 j7 r- x% H
        }
2 r0 x) E5 \6 ~# ]        else
1 r# J. U( P5 T1 @" m) S8 l, ~        {
, ~$ H2 ?/ Z/ O4 Y& l) }6 d) n                printf("No effective message!");  s- r- o& _; {" o6 b- n
        }
. L/ C! P: O5 |! b3 s/ g* \! J4 O}+ }9 v5 P4 h4 W

. U8 h; O6 W, _4 {# Z, s1 i4 h: t' G4 ?! I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 A4 g3 W$ ~  M) Y! E6 t
使用下面代码,对内存使用了mmap函数后:
8 ], m% v% `' d/ l/ J#include <stdio.h>
1 v/ f# ~7 G% W3 y/ m. [- U) `#include <unistd.h>3 U* k8 t$ @, g* s" ~% U
#include <sys/mman.h>' N& H8 G- p/ g. P+ S  I. `3 |: q
#include <sys/types.h>, P4 O2 M- O4 z  y2 h
#include <fcntl.h>+ @' A. ?7 P0 M) N
% d3 Z$ x; i9 X' Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)0 u# z8 [4 ^" z3 s' F
#define SHAER_RAM_SIZE         (0x20000)     y" L) {( i  g+ u: G

' b" s) d' o) [7 qtypedef struct7 |2 T6 K3 [1 X& A
{) a: }8 k$ b) l* A0 c
        unsigned int a;/ L  F* B7 \" D: h) {
        unsigned int b;
6 U/ S* W4 R- E. I% \        unsigned int packet_cout;
% V  D8 [' m# W+ w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ a3 t# O6 o* P3 l" ?" p) j2 }1 p
6 W, j+ R' U( `- u) d. L# e: n% Evoid read_MSG_buffer(int *baseaddr);
) Z- X9 h: E2 U: j, Y6 z( W* funsigned int count_copy = 0;
& {& B: U- T8 Y+ F) ]5 T" h" Y
int main()6 s8 ]1 R7 i! z
{' T* g3 |0 d' {; _! a+ I" Z% `
        int fd;: G! N; u6 s( O/ o0 n) ]
        int *mem = NULL;& E( T# G1 G2 s2 e2 J2 s7 M

  U% u  f3 u2 i; P9 A5 z; \# r; T5 I        if((fd = open("/dev/mem", O_RDWR)) <0)
3 k) v* g- i, M  f7 ]        {4 p- t/ g  e# t; F2 f% w- `9 Z3 |0 Y
                perror("open error");3 @! P/ x5 s; j. q! U  x
                return -1;
0 S% E/ k9 V4 I9 [/ b        }
. }9 H3 J9 J( U, v! |        8 B+ X! e5 @7 f. h% H
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! ^, i! a6 I$ H  o6 O0 i; c5 j! O4 z" e2 ]( R+ i
        while(1)' {: M* X+ u( l' T0 Q+ d. ^) K
        {+ {( l' C/ g) y* M1 N* |6 @) B0 `
                read_MSG_buffer(mem);( e! W7 ]+ e4 j' M7 K9 [/ x; M
        }               
: o( U0 _/ b3 i. \- v- Q' O}
* t, t( v# T% a8 L5 V7 @4 h& g  X, g4 F. i7 |0 y. [
void read_MSG_buffer(int *baseaddr)2 J9 j& m: ], L# W  `: ^9 `
{
8 [, i+ j$ }) B+ _        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ H' o7 g; F) ^$ x
/ ~( D4 z; h- ~8 l( M        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& I: K2 M& E+ P) d( Q; E8 U* ~9 L
8 u8 Z. x; t, p/ m1 m. u  H* ~2 i
        if(pshreRAM->packet_cout != count_copy). \& M3 X8 j; w
        {
+ m7 A4 O0 V" s& c                printf("a is %d\n", pshreRAM->a);
  ~' e0 w, r0 p" w9 B0 k* E                printf("b is %d\n", pshreRAM->b);+ W! T9 H% f& @9 B
                printf("count is %d\n", pshreRAM->packet_cout);* E9 P; B# p# T+ |( A
                count_copy = pshreRAM->packet_cout;0 m: I0 }# j+ r" L) M7 s
        }. `8 Y& O6 i3 y
        else
0 x" S7 i5 n: X+ x( E        {$ {+ W: I: Q9 j5 N" x
                printf("No effective message!\n");
& A5 p* M3 Q# o( }! E: u; K/ m        }
- y5 W% d$ Q  v# \! L( M1 r5 ^}' T  |2 f3 a% b" ~$ K& E1 l

. C7 v4 f& a0 a. c3 r- Y, C  G, j没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???8 ?' U" W$ N5 A

4 y  u: d$ e7 X" S, A  l) c" r$ P& c! k% o5 h# Y
2 t; Z$ O# k! i) f$ {6 R

% e4 _$ T9 m! ?1 H$ @' Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

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

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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