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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 `7 i, a3 G" L  w8 F
" _, z' H& F7 H
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 Y( u) \. r2 D& N9 ?) u+ ^7 i#include <unistd.h>* S2 C- C) c( u$ A. {3 u
#include <sys/mman.h>
0 \, A) \  M/ o/ ]; j( }#include <sys/types.h>
5 _% w% l- O# {$ ~; C, F+ z#include <fcntl.h>& }. P7 A9 h# S( b& J. [: d
8 j2 S1 o) a8 \( u( K: L
#define SHAER_RAM_BASE_ADDR    (0x80000000)   * m) G+ F6 S7 x

7 W7 U# P; E3 ~% h- K9 `+ p1 Ntypedef struct( I/ _0 }) l: T( ^5 y: Q" @
{
9 J+ Z" _' z/ @* u, `        unsigned int a;
; ]* E* t' o) E4 d/ Y3 [        unsigned int b;9 |  X, K. u( y3 M, ^% d/ X
        unsigned int packet_cout;
: J$ g' ]( y* @5 R% R3 W}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ u6 w. @) B  v( H- V5 E
/ B; W. L4 k1 B  d6 H. z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ G; x$ {8 u" h+ vunsigned int count_copy = 0;* m2 Z3 n& x, b6 X$ ]- w

" v# K( A# {1 X! R, v) L1 ~8 I# z& f: N- B: u* q) {9 @
int main()
0 S. P8 k( F8 h$ j% ?9 b{% ~  \# _* ?; t, O2 Q/ c0 v
        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ N% |. c2 f) \        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  u: F) J* F  n% Z& Y3 Q
# E5 y' `6 ~3 S+ M0 S        while(1)
, R  u5 R- j1 ^2 z/ M+ q) t4 l        {
% n/ H1 {$ U! F1 K, F0 b! J5 n                read_MSG_buffer(pshreRAM);+ V6 \5 S; w7 ~1 Y/ y6 k8 S9 ]( n% k
        }               
5 n2 Z( y1 J6 ^# C# w}" z* u# C5 F% l# n  U% |
: Z! W& ~/ Y" R0 q' q- a2 d" f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 k7 ^' `, ~3 Z, \* ~: |
{
1 ^) d) L/ Q" a$ v& f' G8 K3 w% v2 H# H        RX_MSG_PROTOCOL buf;
# v1 j1 T2 K$ _: n        
& ^% Z. M& o0 a& W" v, J" x( K# K        buf.a = pshreRAM->a;
* G$ R  L4 s2 R( C" A        buf.b = pshreRAM->b;
1 |( F8 o8 y: y* c+ d        buf.packet_cout = pshreRAM->packet_cout;$ H* \0 e4 M9 H1 E* g, s, e6 D7 Z
        
, J8 N& A; n: \( i1 H        if(buf.packet_cout != count_copy)! C: W, C/ L6 q' D# B- \: {
        {
5 E+ T# x% }) W9 L; M# W: ]                printf("a is %d\n", buf.a);
/ x$ ^8 Z& P! ?6 W                printf("b is %d\n", buf.b);
* g; |& T2 x" f% V8 [& J& {                printf("count is %d\n", buf.packet_cout);+ i4 X  z" Z) n! u
                count_copy = buf.packet_cout;$ P  k6 F5 b: Q' }: V
        }& w4 Z( k6 C2 t- y" a) G( D
        else
- i4 E! R" V- B        {2 h0 l0 H- g- \
                printf("No effective message!");
1 [  C! @+ {7 i4 Q; C2 Z( C4 `        }
" p! B/ {$ B( f}$ J0 Z9 E, N  P* y+ H: Y
# ~! N$ S3 i6 J
( q( u( ^5 A+ I+ Z3 @* i1 X/ e  s
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, z1 \  g3 E: F5 e" z使用下面代码,对内存使用了mmap函数后:
, K  {/ V% f3 _6 N% u8 V+ j3 G( [% c#include <stdio.h>* G* C+ p) K: b" ^- a! R' S+ R
#include <unistd.h>
/ ^% b( `: ~2 w1 O* o5 P+ N#include <sys/mman.h>
& H( r4 f. x2 M& R#include <sys/types.h>' i" q* @: q- [
#include <fcntl.h>. r/ V3 r, ?3 X8 U. w' S
, Z' G8 _/ V. a5 k8 i
#define SHAER_RAM_BASE_ADDR    (0x80000000)# ^( p6 _" i3 ?3 C  n
#define SHAER_RAM_SIZE         (0x20000)   
! S% Y' |1 U1 i$ k% \) u, N
1 t# \: F; m) Qtypedef struct- z' ]% N# F  d
{5 h7 N* b/ P2 f( f7 B  H$ z
        unsigned int a;
3 `2 h5 k5 b& w( S( J( k        unsigned int b;* p3 l8 P, x& ]- e1 {2 D+ L
        unsigned int packet_cout;
+ l, L3 q( H& p7 ^}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ k7 q, Y2 R- z$ l5 D0 C
9 m- K) ^8 _8 O8 z& c, l+ Z) h
void read_MSG_buffer(int *baseaddr);
' y, X) j% Y5 C% z; Punsigned int count_copy = 0;
* H2 X' r1 R8 A! s& y
  A3 ?' C# E  j0 X/ \9 rint main()5 e3 @, _  K3 x6 c
{
3 W. H# h+ W% U1 l$ G* r0 `        int fd;
( D! d4 V" }) H  \/ D( Y3 \        int *mem = NULL;" ^+ ]5 Q. P3 a. `5 M1 |

5 ^+ E& J% |4 X$ B: i  Y" Y, Q- C        if((fd = open("/dev/mem", O_RDWR)) <0)4 ~! o8 {* D( M2 t2 N) ^
        {2 K7 _6 x2 ?0 L: j3 g& K1 K* N" C
                perror("open error");0 C" g7 U9 @9 ~+ `( b! g+ N8 W
                return -1;
. j/ V" R/ A, V' `( \, O8 b. @        }7 u+ a7 |0 L& w. U
          k' p2 X% b9 x$ L, {% E
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; i2 d/ {' Q8 k: G& F. e* b$ r
! C  _) b! j$ U) ^$ U' a* j1 \$ v( V
        while(1)9 g" w6 U2 O( w2 a% {. G
        {) {2 ]$ E# b4 c  }+ `; f& G6 M
                read_MSG_buffer(mem);; c- l) L' X# `. ?
        }               
9 X- x; `1 U0 a2 s+ o}6 n( L9 Y9 C; o

) ]8 M) M/ d( d: `8 Tvoid read_MSG_buffer(int *baseaddr)
6 O- Q! T' G. h  ^2 m& V{- d8 m, `8 [& D$ \+ _, ]
        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ e7 B" ]6 ?, {) u0 i
( |) }5 X( P; ^- t        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; n5 F; x4 Z# b9 M. O3 e

; ~# L2 ^* }7 h+ S$ o+ @9 X        if(pshreRAM->packet_cout != count_copy)
6 j( N  W  U0 B: [1 F        {* B; |8 y' ]! S& D, b
                printf("a is %d\n", pshreRAM->a);
  L. {. W! j) ?; ]7 m, {1 r                printf("b is %d\n", pshreRAM->b);
0 n' ^4 u2 y- G6 ~                printf("count is %d\n", pshreRAM->packet_cout);! w1 Z8 y9 e0 K7 E) U5 T4 O7 W
                count_copy = pshreRAM->packet_cout;
6 T! z3 ^5 v2 J: I        }! a1 V2 u" X: a9 m
        else
' E! Y9 g* `% C+ X$ I- }        {
% b: k8 V3 k; O0 W  O) z0 g1 r) T  k                printf("No effective message!\n");
# S8 Q+ d8 @' T/ S        }
& Q  V+ j9 Y; F( Y( g, i3 u}
# I2 g- ?& B4 N9 {% s4 {; R. K! K9 x: j: A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 C" I$ C8 G$ G7 u+ ~% X

$ O7 e6 |, H: }4 y$ t0 \( E
8 P- b. |4 i- q
8 o! y7 s& {6 j' W6 j4 {) f- b/ \+ ]0 A* D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

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

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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