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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & k& M: \4 s, v  }4 C( o  q$ w" U
: I* O- G1 D( ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. A& D9 t+ S5 D: `- A#include <unistd.h>6 [! W( X* T/ x
#include <sys/mman.h>
% g9 n" h- ?5 G$ K6 L% S9 R#include <sys/types.h>* ?( I5 v& m" c/ L
#include <fcntl.h># h. q; _6 }$ t& k

+ H; ^1 ^5 G7 c7 U#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% j+ b# K$ p, g+ m
- t/ b- g9 Y- ?. D& _0 Q  ztypedef struct
: G7 R; e4 D5 ^2 r{
! r3 e" K$ [; I, W        unsigned int a;
, k& Z/ r6 f0 V1 g" p        unsigned int b;
) ]9 ], P6 M& e9 r        unsigned int packet_cout;
2 ^, G) i1 w5 v) s# j; V8 g. m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 y) T" D" j0 ]3 q/ n/ V+ @, K9 I6 W" z: g+ }- @0 s/ x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 R4 v- ^) k1 A4 r
unsigned int count_copy = 0;
, H& D" \% b: R* E& p# m0 J* z8 [$ f0 v5 l4 R
; C0 A1 c7 q( R1 [
int main()
+ k0 d4 [: N% a* u{8 ~! m/ w, t% n' P2 F  v% R
        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ V+ E6 t& q, M$ t( j! Y, @, z        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ f# p/ S9 a  B5 S# ~
  _7 J, @7 ~3 |5 ^" M2 T- A5 c+ J        while(1)
% L/ A( r$ z. j, `) s        {
' B7 E/ Z7 R2 N* ]0 J) \2 F                read_MSG_buffer(pshreRAM);) V9 L$ r% E5 F" M
        }               
' y& I7 _9 `! O/ f2 S& X}2 ~( E; u: Z" W$ v6 f
* s  M9 q1 s( c  V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 c6 P0 q" y6 n3 f, d" m* D{
9 N* k0 G( q/ Z. h8 w        RX_MSG_PROTOCOL buf;9 x9 w: Q+ v, L9 V. f
        ! h# O% q9 S+ p: i. F- r4 E( U
        buf.a = pshreRAM->a;
. [" y) v- q* v" R5 z4 _! w" x        buf.b = pshreRAM->b;
, e0 ^( [. u; p* K  d; D2 s7 @# ]        buf.packet_cout = pshreRAM->packet_cout;# p2 [  U# _9 J4 _6 R
        
& ]0 U/ D' `3 b, Z  z        if(buf.packet_cout != count_copy)
7 n' T/ ^# g  D, |( D' n        {
) s; g( w. j/ D2 u                printf("a is %d\n", buf.a);" b, B. q7 }5 A
                printf("b is %d\n", buf.b);9 r) Y, h: e/ _4 g) B
                printf("count is %d\n", buf.packet_cout);
% I* o; g5 F) x8 o                count_copy = buf.packet_cout;' A0 V+ J  z; B2 q6 s
        }
+ n# T$ s% O0 d# e        else
% Z, y  v$ f- \( A. I; n5 D* _        {! r1 s$ v. P/ m5 Z8 }
                printf("No effective message!");& u$ y+ V$ X" x- T! V9 h( f; V5 v$ K
        }
7 v$ _$ G1 y6 M9 l8 v}
, I  x1 j* W# u7 G) {: j
% \& P+ K3 w; a5 ]- I
& q* `0 |! w! p1 a但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 n9 V& K0 m, }+ J4 b- N
使用下面代码,对内存使用了mmap函数后:8 E& B5 H/ S4 ]$ q
#include <stdio.h>% U. x- h# j' z/ O" G/ F
#include <unistd.h>
7 J5 J1 }5 P& [2 W" T#include <sys/mman.h>
9 P2 q  \  W/ J6 l1 F: L#include <sys/types.h>+ T) B" V/ @6 m2 \
#include <fcntl.h>$ E( ]7 @5 r& R5 i8 ~3 ~* ~) k- W4 ?

1 Z/ z, l% n$ ^9 z+ u#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 M+ x4 y& D) W" K* u+ ^#define SHAER_RAM_SIZE         (0x20000)   # Y  ^5 U; l) B4 M" @

4 e7 p0 E2 s  W' D9 D$ x* N4 \4 S9 atypedef struct! j$ P& |; c2 A+ y
{4 @2 p6 D/ {! ]8 L; n- Q
        unsigned int a;
  m+ L& B! b5 D$ `& Y/ J' \        unsigned int b;
! s) W/ Q( s3 B% M6 E        unsigned int packet_cout;: q3 f7 ~. @* K8 U/ J$ S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 ?1 v% u4 Y; q$ T' e$ P
- _. L8 ]- B) y3 M$ i" U( V- [0 B% Nvoid read_MSG_buffer(int *baseaddr);
5 V6 U7 T7 o+ {5 ?. Munsigned int count_copy = 0;7 ~  t: G0 h& J' t5 m+ H
& I" f4 n5 E" T9 \, _' V% o7 O9 {( m
int main()4 `6 y2 k, O) O) d: L  y2 L" G
{- ^9 H0 Q" r3 z
        int fd;* J. ]' |3 l" I
        int *mem = NULL;6 \8 r1 K8 U+ E  ~- i- _

0 x2 T" d* D8 ~- B# S% [) L& Q        if((fd = open("/dev/mem", O_RDWR)) <0)
3 _& B. ^: I1 L/ m) M1 Y+ u        {
. L5 F1 u/ n; o9 v0 f( H% }                perror("open error");+ W3 x% z1 y# I/ J* m! F
                return -1;
: w, l% Z+ R. u' Y6 e        }- F9 u, u6 P+ y* ?/ c
        
9 G2 ^' l  ^5 w1 Q        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. P0 ^! p1 B" o  m% x) t9 k+ y) N. L0 s' K! _4 [4 `
        while(1)
9 q" B# z7 Q  w$ I  K; i/ s, z        {
3 e/ t, X" l) ^% p( h                read_MSG_buffer(mem);& o, K( s8 _4 Y* g! u  R
        }               
# L9 U# r7 c9 E, h}1 T3 x. U4 F3 j
, g% h) B& Y1 L: C
void read_MSG_buffer(int *baseaddr)
2 ]' s  v$ ~6 ~  L" t7 S{
, q' |) _6 k' p& z/ Z        pRX_MSG_PROTOCOL pshreRAM = NULL;! C; [4 f' e+ R+ k5 a9 O

# e+ m9 I. \3 j        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 S5 V% y2 j  T& B  {  x6 w; l. j0 r# h  O/ l4 H2 X
        if(pshreRAM->packet_cout != count_copy)
, p9 W0 [5 M3 J/ {        {, Q' E. _$ n) {9 R( g, X
                printf("a is %d\n", pshreRAM->a);+ ~+ U, Y8 O' C( X; K0 r
                printf("b is %d\n", pshreRAM->b);
8 O) y( A7 F7 V$ n+ h                printf("count is %d\n", pshreRAM->packet_cout);- y9 v1 W* A( H6 M5 J& Z( [
                count_copy = pshreRAM->packet_cout;; ]! V1 L8 \2 `$ X. g
        }% @% v) \1 L7 o; j$ f- m+ o  _
        else' ?6 m" p: A, W( p$ E# O- G# J3 ^
        {+ m. h* b0 V# u$ f6 V
                printf("No effective message!\n");
3 l1 j6 S1 P1 M0 Z/ A$ d        }4 Z0 n6 N3 j, N4 i8 f
}: N* g% T  Z; a

& Q' P! i' Z: V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 b: a# P; a0 ^6 d: _: L9 s' W2 `( @+ G( }) f  T

& i* y4 v9 ]4 m8 N- a! s; u( D4 r0 g0 ~! ~: l% \) e
5 {4 k) z/ {4 q+ X% u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-18 01:46 , Processed in 0.049865 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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