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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " k' r4 }" p4 Z
( x) [+ B2 g: r# U* V% m% t8 [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ u  L* q# D/ `' e0 D9 X. ~#include <unistd.h>0 Q2 F5 }% p% I0 E' {" I: W) n
#include <sys/mman.h>
0 Z) O) S9 g; `; K% M#include <sys/types.h>
" E2 d' z+ q% x, ]$ y) N3 r#include <fcntl.h>
8 o) p, n3 Z; T% O6 u0 \. J$ H/ E6 O
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 q3 N6 v: \5 A0 S5 t2 Z% s0 Q  G
  W9 L4 w' k! }6 Ktypedef struct
  c. o& N9 a9 q" ]7 b{
* I+ ~( r, }4 |0 P        unsigned int a;
: D, R' d* H0 Z/ m2 D        unsigned int b;
' i  s& D0 U; ^' }' U: o        unsigned int packet_cout;1 L4 ?& L/ r- p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( x2 ~( X+ {0 ?! `9 F" b( S

- Q" [% f4 V! X3 U/ y7 |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. G) j! }4 E5 e- n, p* f& K2 r0 eunsigned int count_copy = 0;
$ a, K9 u: }  g, w' V
/ n* B1 O0 a" `( w+ U3 K( ]6 \0 ?0 h
int main()# T! k" d, G+ v8 D) f
{
9 T, H0 f% z8 P2 E* A6 m! I        pRX_MSG_PROTOCOL pshreRAM = NULL;6 P0 [- v! Y8 a: I' P- u( I
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 h' F4 x! i( g+ b! x
0 V- X2 D$ v0 s- w" S        while(1)
" S3 @2 f+ z: x& N. c7 d3 P! m        {4 c* u; V* C6 o; [
                read_MSG_buffer(pshreRAM);0 `3 N  a1 |5 I$ B& U% i
        }               
# M7 s0 x3 s' n2 @! I}
7 c$ v1 A+ j0 g0 R0 o# d1 p, m& _2 X5 M  ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 Z' A5 z& Y; R& o( ~' P
{% x/ F  [9 h3 u: ^! C$ r
        RX_MSG_PROTOCOL buf;9 z8 I  |( R- b5 Y! U: e
        
  P1 F. p( n3 J" M        buf.a = pshreRAM->a;: {( e' U7 h+ N) Z- _
        buf.b = pshreRAM->b;
- L) S+ b" {6 K: L) V* |2 a+ s        buf.packet_cout = pshreRAM->packet_cout;" q% q+ a. l* M+ r
          x/ e% {+ d7 ~  v5 r! i# o
        if(buf.packet_cout != count_copy)
$ I- i# y! b7 f6 K! H        {
, _9 D! F/ E! Y. l" }: e                printf("a is %d\n", buf.a);6 y+ d/ X5 k/ |$ `  s: |
                printf("b is %d\n", buf.b);7 q4 B& P$ ]; {% n2 ]$ Z) c  [
                printf("count is %d\n", buf.packet_cout);
' k* h8 e( g; o5 J; W4 y                count_copy = buf.packet_cout;0 V/ H8 u7 x  z
        }. r8 {) [, F- \5 h: Z& n
        else5 Z+ }& J0 z' N6 Y0 h
        {$ A$ s* g) `! s- e" q
                printf("No effective message!");
: ]% E: F2 f. w; a4 K        }
* P  a; k+ F+ S7 _% p+ L}
( m/ C, Y6 v7 X; K$ p2 ~4 w, |! e, _

) i/ U6 k6 c' C, V但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& I: [: e+ F6 E使用下面代码,对内存使用了mmap函数后:
) h# V% m$ n+ A+ O$ y  l#include <stdio.h>
/ d2 P; _: e. h5 b& W% L+ _# w5 _#include <unistd.h>$ |/ o: a* G8 j9 w4 `
#include <sys/mman.h>" @2 B' n" [# U; p$ c1 Z
#include <sys/types.h>1 H, S6 K2 R+ d0 w% n* q+ }
#include <fcntl.h>
2 R$ V; y. j. K9 N
: ^$ O5 I* E+ D#define SHAER_RAM_BASE_ADDR    (0x80000000)
% C2 h5 b( H8 B0 u8 [" U6 \#define SHAER_RAM_SIZE         (0x20000)   
& m4 k( Y5 I- M* @4 T2 Z- ]4 D5 }# U
typedef struct( \9 B6 _7 p5 ^* z
{
3 e/ c% ^4 M) |3 V, E1 w' F5 D        unsigned int a;. V1 o6 A. N9 ~9 h; `
        unsigned int b;# F$ |- d. J1 N5 G- o; o1 V
        unsigned int packet_cout;9 d& S. e+ i+ A" d1 c9 G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 r8 z9 x# r' _, H, R% R! q2 Q* Z& B, T+ T  \% D! r
void read_MSG_buffer(int *baseaddr);# X8 O$ O" D" Y
unsigned int count_copy = 0;
. w- |, N4 f: Y0 C, A
. v9 P) l, Z1 I4 |int main()0 _- k- J+ J9 {3 y, W
{' _  K, C( l4 b9 l5 w) X: [
        int fd;
2 D8 Y2 m0 ^& P        int *mem = NULL;
5 Q+ |8 t* E& I3 }: H6 J+ Q8 ~0 v9 p7 P
        if((fd = open("/dev/mem", O_RDWR)) <0)
+ S% o% O# Y+ H' I        {
% C- s! B; c1 F0 x1 W/ I                perror("open error");; R9 D7 k" T+ m0 j, d& m- X
                return -1;
# p, `2 v* F5 B" d5 r$ _        }
7 ]% m9 q# `" Q* o1 h3 ^        
; D# i( ~( t' ^: {        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 v6 b( o, c) ?( H$ W, n6 ]
1 \) C) `9 z2 x" e
        while(1)6 P8 H1 g# A5 v7 M: R
        {$ l; B$ N8 E( D( H1 K$ q, q4 g
                read_MSG_buffer(mem);
2 e3 N' R! @  g" [( h* {        }               
. y" e, r! u9 m4 u$ i}! t0 ?' ^' I% L$ E& @1 y

# v5 |2 D! T/ n' U- L! uvoid read_MSG_buffer(int *baseaddr)  L5 Q' U& O5 I0 a' D  n
{/ o. l- x! X; k4 Q$ a$ w  ]5 B# ?: J
        pRX_MSG_PROTOCOL pshreRAM = NULL;; l& I- E& b3 p

! \, A2 J+ i6 L        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ a4 x! A, |' e! U7 }
4 ]$ l; u, k$ `0 K3 r        if(pshreRAM->packet_cout != count_copy)* F3 L$ S. ]7 O& C, P; s
        {/ J- T* p! [% t
                printf("a is %d\n", pshreRAM->a);
8 d, p- ?9 g( Q4 r8 v: S                printf("b is %d\n", pshreRAM->b);* z7 m6 W% I( p! X
                printf("count is %d\n", pshreRAM->packet_cout);
0 b7 R* E- h* o8 E& y: I  u' t( A                count_copy = pshreRAM->packet_cout;
3 Y( P& W8 j" A/ f: j  Q: C3 E, ]        }
' H4 o5 W) F$ ]+ n        else
  {$ h& u7 C- e5 F0 w) L        {4 e- {" u4 h9 @
                printf("No effective message!\n");: ~4 p" ?% U% n; f/ \  c( D& e  n
        }% k1 n4 E, N" A( v/ H5 n" H+ M
}
6 Z% E" O/ p% m' \3 l7 \
/ T9 A6 I8 ]/ Q8 h' r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. ~6 u7 W. L9 P. Y: ~2 ^) j

/ t: }  P# k1 X6 E  D
; G4 E, R8 _2 k+ y
9 w% B; p  ^; P$ Q( b# @3 X% @2 }+ \1 ?- M/ D0 J. ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-8 06:32 , Processed in 0.041714 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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