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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, X, v$ X/ h; G$ e  y( b* [, o% q9 k& N2 U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. [9 j; i2 x6 T7 o
#include <unistd.h>, Q( R2 B! Q& k
#include <sys/mman.h>
  v; h, w/ B& U- v#include <sys/types.h>
0 }$ p" P* `, D1 L#include <fcntl.h>
4 l: r# _7 K3 {( H& F' Z( w% M: k+ _( {& R1 ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ' \2 `& O& Q: W4 ~
' g8 f2 Q3 p  {! [8 S% U
typedef struct9 a; Y' I' B( y- |
{
: _; @3 K; \, |( h        unsigned int a;
1 @$ _, ~) `2 [; B1 g: p4 d        unsigned int b;
7 J& T1 B& _5 Y& v& w5 U        unsigned int packet_cout;- B8 Y' c# r, d3 ?8 S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 g" [! r0 W. {8 I+ o
7 n. X& v7 V  T- n- |+ U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" {3 s6 q" W2 i( ?' T
unsigned int count_copy = 0;
0 A' G" n- h& l/ c. j( M9 ^! Y8 l. A* Q( g/ ^  o

3 z" T2 C# }# y$ h9 R  sint main()
: K8 c0 b1 i. S* Z5 A{
. K* X  s, k* l- R        pRX_MSG_PROTOCOL pshreRAM = NULL;' m$ J2 Z2 g! p
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. T6 L0 a' B. S, W3 F
% ~* O3 t! L- r        while(1)
; ?- L3 ]; J4 D9 s1 }" T8 `        {
, @" l2 }7 v4 ?" w                read_MSG_buffer(pshreRAM);2 T8 i: m( {5 y; o: ]8 ]
        }                # V7 y- p& j$ K4 }8 S
}% Q, T) B) a& E9 Q, E  _
: x" q9 r2 l/ K+ ^+ q, t% H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ t+ m2 N6 G9 p) o" b8 d{
: R. a) v- Z0 p) y4 k, A        RX_MSG_PROTOCOL buf;; `6 e! {" U8 z& A
        
  g- }, o0 Z. T" P. L  O0 {4 n        buf.a = pshreRAM->a;
; J  W! ^0 O2 ]4 w        buf.b = pshreRAM->b;5 Z9 I9 b( \9 g+ U+ b! g
        buf.packet_cout = pshreRAM->packet_cout;; X8 \" S% a, H$ s" G9 G/ j
        
1 |7 g2 i2 h) y# t3 r        if(buf.packet_cout != count_copy)
3 J% k0 ~7 d$ T% n9 p        {1 y4 q2 t5 t' }. W
                printf("a is %d\n", buf.a);1 d  a+ `4 v  k0 t. H
                printf("b is %d\n", buf.b);
6 K$ O! g& Z9 A0 i, n0 n                printf("count is %d\n", buf.packet_cout);% J) R6 \( ?: ]7 f: e7 @  f1 n
                count_copy = buf.packet_cout;
# t0 r& W% R$ g# O( W        }# [5 d) m( {+ }2 h6 i: m) P& Q
        else7 r" g: P" q4 f
        {
# U7 o3 y" I4 P. ~) T1 `                printf("No effective message!");
6 k4 a2 n1 M4 B, d* ^- \* q        }
/ h+ Y& s5 t( t# G; w9 P}5 q/ }1 E) E/ k& e+ a) t- ?
& G& e+ h3 _% @7 L, F+ L' @- Z
& T  v* w% W  ]$ @% q! ^  X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; U- {8 u+ K3 u+ x) c( s8 O4 X
使用下面代码,对内存使用了mmap函数后:
- r: X: k: x% j' A- v#include <stdio.h>/ @2 U( v- n' S+ q4 M2 B5 C5 [
#include <unistd.h>% R! a! L* s# N! L9 s
#include <sys/mman.h>
7 R' S; `$ [. `* g( l#include <sys/types.h>
( C* z! ^5 I) _* K5 S" _& i#include <fcntl.h>0 ?+ J5 b- h5 A0 _0 x
9 j) G' a) m, R  O" F  o6 G
#define SHAER_RAM_BASE_ADDR    (0x80000000)) w# h. Y8 e! S' O" A& J+ r2 w
#define SHAER_RAM_SIZE         (0x20000)   
; M. B  Z- ]8 `% |$ ^4 {: [. z; J$ |# t8 C
typedef struct/ \& v) X+ p- z4 m1 R
{; m) M; o5 V# z! g. h* i. j
        unsigned int a;1 e! d6 ^9 a6 ~5 [1 b
        unsigned int b;
7 H' o; U. x8 c& S' c1 N        unsigned int packet_cout;+ |- s8 E; W0 c  ]4 O6 k9 C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! s4 C6 y2 |1 P" ]9 V
) O. I% {; o5 D* C* Hvoid read_MSG_buffer(int *baseaddr);
- t0 V0 _: h# S3 ?unsigned int count_copy = 0;
( k8 d/ Z% T9 g3 O  ?+ K
7 Q# w! t. }5 v; n0 P6 D/ lint main()2 j7 T) Z: c) Y/ q* n. N
{
$ N* x' @- C+ J( ~- Y# m, z9 ~  f5 x        int fd;
( b. z( N- Y. f4 s5 `4 @" x3 u* y        int *mem = NULL;
3 b8 |( @9 x& D6 C5 L" U7 z" [8 ?. L0 a9 u) K3 L
        if((fd = open("/dev/mem", O_RDWR)) <0)2 y9 g$ q. \0 l+ a7 K9 M+ b5 X
        {( `* C9 V* M$ T; r- Q! N& l
                perror("open error");
- e4 [% E& X' l. w                return -1;8 v1 E7 d. G/ X9 o) V
        }
9 m( m' ^6 W' P4 N: C6 x9 a        2 U7 D2 U6 [) G5 X
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. S$ S$ `* b' M; {5 _1 C  ?4 I2 Y) _$ u% S, X$ W( r/ O( y
        while(1)0 W6 M3 J/ ]6 q) r7 K& i
        {( _4 {, t" r+ H; q, |4 E1 D
                read_MSG_buffer(mem);
" n5 w# R% A4 X% @/ |( a        }               
. i. f: j1 R- {+ d8 g9 z1 V9 A" W}) H6 ~! {) m1 g# Q# I# {: Q

1 O' x4 ?, ?( j! |( m+ M: y/ e# vvoid read_MSG_buffer(int *baseaddr)4 Q& ^# A- v- g/ m7 e
{! k) u" Q1 n5 Y$ w
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! I3 H$ k# ~. c+ @% C3 O* j+ t# E  E( ~/ w# a, b
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ f1 Q: z4 p1 t# t* ~) d
' w5 i: I+ S+ S9 @
        if(pshreRAM->packet_cout != count_copy)
( a! S4 u/ S. r# r& w) x        {% m7 `; r. _0 Q+ k; ]' U
                printf("a is %d\n", pshreRAM->a);) G( e2 m/ U* [7 q# p
                printf("b is %d\n", pshreRAM->b);. r) o8 M0 Q3 l
                printf("count is %d\n", pshreRAM->packet_cout);+ F% [6 z8 l. Y0 T) B
                count_copy = pshreRAM->packet_cout;6 C  k* V. Y  P
        }
: \1 v8 F# F2 L! f% Q' ^        else
7 c$ V/ k1 `- q. z; F8 Q# @        {7 p2 K$ ^5 e& B' Y4 E
                printf("No effective message!\n");
. x+ E2 G/ a/ X6 {! P: H% ^        }: [1 M' M; E) }5 `/ [2 G
}
6 }4 z& E) `. W; `2 C/ T
2 S3 i8 \1 Z8 q+ y; j没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 u1 b9 {8 }  Q$ t3 Z/ f) Q
7 Z' o9 ]1 J5 h! n6 T2 ^0 p! h9 k! _4 J# I3 ^  n

5 e7 w% j% J) e+ s, N& s
1 B! G, B6 W0 t, a0 e: b: \! I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-1 20:27 , Processed in 0.039496 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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